## 概述

AVPlayer可以用于播放格式化音频，支持WAV、MP3和FLAC等格式的音频。AVPlayer提供了ArkTS API和Native API，本文指导开发者使用AVPlayer的ArkTS API实现播放格式化音频的功能，主要涉及基本播控、精准跳转、静音播放、倍速播放、音量控制、焦点管理、后台播放与接入播控中心、冷启动等开发场景。

本文是音频播放系列文章的第3篇，实现的功能效果如下：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/35/v3/0cLNulyGTp-siXBS5-satg/zh-cn_image_0000002555217523.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=5300835BC12C779027092A14ED9D3EE561875673C810E3B18A510EE06278B00F "点击放大") ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/68/v3/iP7Gx5DaQC6sKzwQ1btQpA/zh-cn_image_0000002524217626.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=F06AB6F8FDF2C98C191DD59A11D25CA436057936E4E77AD6BDF7A9BE68D473FB "点击放大") ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/eb/v3/Qb9gW75XSdiU4IcO0KszHQ/zh-cn_image_0000002555337497.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=5CE342A9E9B7C959AD7B009DE7BAA77A5F7F95938FB4A2F8CC0A7C751058C395 "点击放大")

## 场景分析

展开

| 场景名称 | 描述 | 实现方案 |
| --- | --- | --- |
| [基础播控](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section1764813377511) | 音频资源的加载、播放、暂停、退出等操作。 | 使用[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)接口实现。 |
| [跳转播放](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section16920851193717) | 滑动进度条精准跳转到指定时间进行播放。 | 使用[Slider组件](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-slider)实现进度条，在[onChange()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-slider#onchange)回调中触发进度调节获取目标时间，使用AVPlayer的[seek()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)接口，跳转到目标时间。 |
| [静音播放](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section125715278533) | 点击按钮设置静音播放。 | 使用AVPlayer的[setMediaMuted()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setmediamuted12)控制静音状态。 |
| [切换歌曲播放](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section590418431566) | 点击上一首或下一首或歌单列表中的歌曲进行不同歌曲播放。 | 使用[reset()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#reset9-1)接口重置播放器状态，给AVPlayer的fd或fdSrc属性赋值为新的歌曲资源，实现播放不同的功能。 |
| [倍速设置](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section189460361122) | 滑动倍速调节面板调节播放速度。 | 使用[setSpeed()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setspeed9)接口设置播放倍速。 |
| [音量设置](/consumer/cn/doc/best-practices/bpta-playing-formatted-audio-based-avplayer-arkts#section88718617116) | 滑动音量调节面板调节播放音量。 | 使用[setVolume()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setvolume9)设置播放音量。 |
| [接入播控中心](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section06660114245) | 通过播控中心，控制播放、暂停、切换音频、调整播放进度、切换循环模式 | 具体原理、方案和开发步骤参考[接入播控中心](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section06660114245)。本篇文章不再赘述。 |
| [后台播放](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section1749719114143) | 音频切换到后台播放。 | 具体原理、方案和开发步骤参考[后台播放](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section1749719114143)。本篇文章不再赘述。 |
| [接入播控中心冷启动和历史歌单](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section476545143517) | 应用退出后，播控中心显示历史歌单，点击播控中心播放按钮拉起应用播放，或者点击歌单拉起应用播放。 | 具体原理、方案和开发步骤参考[接入播控中心冷启动和历史歌单](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-playing-pcm-audio-based-audiorenderer#section476545143517)。本篇文章不再赘述。 |

## 基础播控

### 场景描述

通过[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实现核心音频播放控制能力，包括音频资源加载、播放、暂停、停止及退出等操作。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/82/v3/9JHS2aU7TfiUizuXoJcpvQ/zh-cn_image_0000002524057632.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=609D47B920EDDE1BBFE0A1C62BFE422AF41C694B44BBE6C0B2BA78A8F64ACDC9 "点击放大")

### 实现原理

核心原理是使用[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)接口实现播放、暂停等功能，需要特别注意的是，AVPlayer播放器在执行不同的操作前，必须要保证此时处于正确的状态，比如执行播放操作前，只有当前状态在prepared/paused/completed时，才能正确执行，否则系统可能会抛出异常或生成其他未定义的行为。AVPlayer的播放状态和不同接口间的关系参考[使用AVPlayer播放视频](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback)一节中的播放状态变化示意图。

主要的开发步骤如下：

1. 开发者可以通过[createAVPlayer()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-f#mediacreateavplayer9)构建一个AVPlayer实例，创建成功后，此时播放器处于idle状态。
2. 注册[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)回调，主动获取当前状态变化。

   注意

   因为AVPlayer播放器的接口是否能正常执行和当前的播放器状态有必然联系，建议开发者务必注册[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)状态监听或者使用AVPlayer的state属性主动获取当前状态，保证在正确的状态下执行对应操作。以免发生异常，影响开发效率。
3. 注册[on('error')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onerror9)回调，发生异常后，监听错误事件，可以快速根据报错信息进行定位。
4. 通过url、fdSrc等属性设置播放资源，设置成功后，播放器会进入initialized状态。
5. 执行[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口准备播放音频。需在[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)事件中，监听到播放器成功触发至initialized状态后，才能调用。执行完[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口后，播放器会进入prepared状态。
6. 执行[play()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#play9)接口，播放音频资源。

   注意

   第4步设置完url、fdSrc等属性后，播放器并不是就立刻进入initialized状态；第5步执行完[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，播放器也不是立刻进入prepared，都是需在[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)事件中，监听到播放器成功触发至initialized状态后，才能执行下一步的操作，否则接口会执行异常。

   7. 执行[pause()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#pause9)接口，暂停音频资源。

   8. 执行[stop()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#stop9)接口，停止播放音频资源。

   9. 执行[release()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#release9)，销毁播放资源。

### 开发步骤

1. 通过[createAVPlayer()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-f#mediacreateavplayer9)创建一个AVPlayer实例。

收起

自动换行

深色代码主题

复制

```
1. // Initialize the player
2. public async initAVPlayer() {
3. if (this.avPlayer) {
4. Logger.info(TAG, 'avPlayer already created');
5. return;
6. }
7. this.avPlayer = await media.createAVPlayer();
8. this.genSpeedMap();
9. Logger.info(TAG, `createAVPlayer success， curState is ${this.avPlayer?.state}`);
10. this.setAVPlayerCallbacks();
11. Logger.info(TAG, `setAVPlayerCallbacks success，curState is ${this.avPlayer?.state}`);
12. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L59-L70)

2. 注册[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)回调，主动获取当前状态变化。

收起

自动换行

深色代码主题

复制

```
1. // Watch state
2. private stateChangeCallback() {
3. if (!this.avPlayer) {
4. Logger.error(TAG, `stateChangeCallback , avPlayer is undefined`);
5. return;
6. }
7. this.avPlayer.on('stateChange', async (state: media.AVPlayerState, reason: media.StateChangeReason) => {
8. this.currentState = state;
9. switch (state) {
10. case 'idle':
11. Logger.info(TAG, `state idle called , resson is ${reason}`);
12. break;
13. case 'initialized':
14. Logger.info(TAG, `state initialized called , resson is ${reason}`);
15. this.setAudioRendererInfo();
16. this.prepare();
17. break;
18. case 'prepared':
19. Logger.info(TAG, `state prepared called , resson is ${reason}`);
20. if (this.waitPlay) {
21. this.play();
22. }
23. break;
24. // ...
25. }
26. });
27. Logger.info(TAG, `set stateChangeCallback success`);
28. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L259-L308)

3. 注册[on('error')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onerror9)回调，发生异常后，监听错误事件。

收起

自动换行

深色代码主题

复制

```
1. private errorCallback() {
2. if (!this.avPlayer) {
3. return;
4. }
5. this.avPlayer.on('error', (error: BusinessError) => {
6. Logger.error(TAG, `errorCallback , code is ${error.code} message is ${error.message}`);
7. });
8. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L248-L255)

4. 通过[url](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#属性)、[fdSrc](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#属性)等属性设置播放资源。

收起

自动换行

深色代码主题

复制

```
1. async loadSongAssent(songRawFileDescriptor: resourceManager.RawFileDescriptor) {
2. if (!songRawFileDescriptor) {
3. Logger.error(TAG, `loadSongAssent faile : songRawFileDescriptor get failed`);
4. return;
5. }
6. if (!this.avPlayer) {
7. return;
8. }
9. this.avPlayer.fdSrc = songRawFileDescriptor;
10. Logger.info(TAG, `set avPlayer url is ${this.avPlayer.fdSrc}，curState is ${this.avPlayer?.state}`);
11. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L21-L31)

5. 执行[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口准备播放音频。

收起

自动换行

深色代码主题

复制

```
1. // Prepare the player
2. public async prepare() {
3. if (!this.avPlayer) {
4. Logger.info(TAG, 'avPlayer is undefined')
5. return;
6. }
7. await this.avPlayer.prepare().then(() => {
8. Logger.info(TAG, `prepare success , curState is ${this.avPlayer?.state}`);
9. AppStorage.setOrCreate('totalTime', MediaTools.msToCountdownTime(this.avPlayer?.duration!));
10. AppStorage.setOrCreate('totalMsTime', this.avPlayer?.duration!);
11. AppStorage.setOrCreate('progressMax', this.avPlayer?.duration!);
12. });
13. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L74-L86)

6. 执行[play()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#play9)接口，开始播放音频资源。

收起

自动换行

深色代码主题

复制

```
1. public async play() {
2. if (!this.avPlayer) {
3. Logger.info(TAG, 'avPlayer is undefined')
4. return;
5. }
6. if (this.currentState !== 'prepared' && this.currentState !== 'paused' && this.currentState !== 'stopped' &&
7. this.currentState !== 'completed') {
8. this.waitPlay = true;
9. Logger.info(TAG, 'avPlayer current playState is not prepared')
10. return;
11. }
12. await this.avPlayer.play();
13. this.waitPlay = false;
14. Logger.info(TAG, 'play success');
15. this.updateIsPlay(true);
16. Logger.info(TAG, `curState is ${this.avPlayer?.state}`);
17. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L124-L140)

7. 执行[pause()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#pause9)接口，暂停播放。

收起

自动换行

深色代码主题

复制

```
1. public pause() {
2. if (!this.avPlayer) {
3. Logger.info(TAG, 'avPlayer is undefined')
4. return;
5. }
6. this.avPlayer.pause();
7. this.updateIsPlay(false);
8. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L144-L151)

8. 执行[stop()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#stop9)接口，停止播放音频。

收起

自动换行

深色代码主题

复制

```
1. public async stop() {
2. if (!this.avPlayer) {
3. Logger.error(TAG, 'avPlayer is undefined')
4. return;
5. }
6. await this.avPlayer.stop();
7. await this.avPlayer.reset();
8. Logger.info(TAG, 'avPlayer stop success')
9. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L165-L173)

9. 执行[release()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#release9)，销毁播放资源。

收起

自动换行

深色代码主题

复制

```
1. public release() {
2. if (!this.avPlayer) {
3. Logger.error(TAG, 'avPlayer is undefined')
4. return;
5. }
6. this.avPlayer.release();
7. Logger.error(TAG, 'avPlayer release success');
8. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L188-L195)

## 跳转播放

### 场景描述

通过点击或拖动进度条精准跳转到指定时间进行播放。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/87/v3/fEepHfQbSISdlOeAEvhNpA/zh-cn_image_0000002555217525.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=1D85E5074CDA21EC7BE0DF35A4C8545921A411648E0FE7D38E692A3C09062DA4 "点击放大")

### 实现原理

使用[Slider组件](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-slider)实现进度条，在[onChange()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-slider#onchange)回调中触发进度调节获取目标时间，使用AVPlayer的[seek()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)接口，跳转到目标时间。

### 开发步骤

使用AVPlayer的[seek()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)接口，跳转到目标时间。

收起

自动换行

深色代码主题

复制

```
1. public seek(ms: number) {
2. if (!this.avPlayer) {
3. Logger.info(TAG, 'avPlayer is undefined')
4. return;
5. }
6. this.avPlayer.seek(ms);
7. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L155-L161)

## 静音播放

### 场景描述

通过界面按钮快捷切换音频播放静音状态，实现一键开启或关闭静音。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/78/v3/_u5xKVUhT2eCKeOe5ow5zw/zh-cn_image_0000002524217628.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=167D584D5AFB7D015FDB7E037AB3F06794178F91236A304365C87478B3C1CB22 "点击放大")

### 实现原理

使用AVPlayer的[setMediaMuted()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setmediamuted12)接口，第二个参数设置为true为开启静音播放，设置为false为取消静音播放。

### 开发步骤

调用AVPlayer的[setMediaMuted()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setmediamuted12)设置静音。

收起

自动换行

深色代码主题

复制

```
1. public setSilentMode(isSilentMode: boolean) {
2. if (!this.avPlayer) {
3. Logger.error(TAG, 'avPlayer is undefined')
4. return;
5. }
6. this.avPlayer.setMediaMuted(media.MediaType.MEDIA_TYPE_AUD, isSilentMode);
7. Logger.info(TAG, `avPlayer setMediaMuted is ${isSilentMode} success`)
8. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L177-L184)

## 切换歌曲播放

### 场景描述

点击上一首或下一首或歌单列表中的歌曲进行不同歌曲播放。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b6/v3/_H1d5BcFSa-Y8951GaosLA/zh-cn_image_0000002555337501.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=113CC7E94A60602EFD30468B9544B54EEE3A3427ADACA4EE2F50C772717AB0C6 "点击放大")

### 实现原理

使用[reset()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#reset9-1)接口重置播放器状态，给AVPlayer的fd或fdSrc属性赋值为新的歌曲资源，实现播放不同歌曲的功能。

### 开发步骤

1. 停止当前播放的歌曲， 用[reset()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#reset9-1)接口重置播放器状态。

收起

自动换行

深色代码主题

复制

```
1. public async stop() {
2. if (!this.avPlayer) {
3. Logger.error(TAG, 'avPlayer is undefined')
4. return;
5. }
6. await this.avPlayer.stop();
7. await this.avPlayer.reset();
8. Logger.info(TAG, 'avPlayer stop success')
9. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L165-L173)

2. 给AVPlayer的fd或fdSrc属性赋值为新的歌曲资源。

收起

自动换行

深色代码主题

复制

```
1. async loadSongAssent(songRawFileDescriptor: resourceManager.RawFileDescriptor) {
2. if (!songRawFileDescriptor) {
3. Logger.error(TAG, `loadSongAssent faile : songRawFileDescriptor get failed`);
4. return;
5. }
6. if (!this.avPlayer) {
7. return;
8. }
9. this.avPlayer.fdSrc = songRawFileDescriptor;
10. Logger.info(TAG, `set avPlayer url is ${this.avPlayer.fdSrc}，curState is ${this.avPlayer?.state}`);
11. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L21-L31)

## 倍速设置

### 场景描述

滑动倍速调节面板调节播放速度。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/40/v3/B4keWH74RIOZCpI1oPW2dw/zh-cn_image_0000002524057634.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=793426F275435FF8C10F8D3B4156999F19CD994E3A827C1B07183137D21CCE38 "点击放大")

### 实现原理

通过调节面板获取目标速度值，输入到[setSpeed()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setspeed9)接口中，实现设置播放速度的功能。

### 开发步骤

1. 通过调节面板获取速度值，传入[setSpeed()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setspeed9)接口中。

收起

自动换行

深色代码主题

复制

```
1. Slider({
2. value: this.speed,
3. min: 0.25,
4. max: 2,
5. step: 0.25,
6. style: SliderStyle.OutSet
7. })
8. .layoutWeight(1)
9. .showTips(true, this.speed.toString())
10. .showSteps(true)
11. .onChange((value: number, mode: SliderChangeMode) => {
12. this.speed = value;
13. MediaControlCenter.getInstance().setSpeed(this.speed);
14. console.info('value:' + value + 'mode:' + mode.toString());
15. })
```

[ControlAreaComponent.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/view/ControlAreaComponent.ets#L379-L393)

2. 使用[setSpeed()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setspeed9)接口设置播放速度。

收起

自动换行

深色代码主题

复制

```
1. // Set Speed
2. public setSpeed(speed: number) {
3. if (!this.avPlayer) {
4. Logger.info(TAG, 'avPlayer is undefined')
5. return;
6. }
7. Logger.info(TAG, `set speed is ${speed}`)
8. this.avPlayer.setSpeed(this.switchSpeed(speed));
9. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L100-L108)

## 音量设置

### 场景描述

滑动音量调节面板调节播放音量。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3a/v3/jMD0BDBiQKm09viuLxp0aQ/zh-cn_image_0000002555217531.gif?HW-CC-KV=V1&HW-CC-Date=20260414T060044Z&HW-CC-Expire=86400&HW-CC-Sign=DAE0DCF4FC1C50B087E5F2D9C250C1C4EC9290B91BB83635896A00E092169924 "点击放大")

### 实现原理

通过调节面板获取目标音量值，输入到[setVolume()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setvolume9)接口中，实现设置播放音量的功能。

### 开发步骤

1. 通过调节面板获取音量值，传入[setVolume()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setvolume9)接口中。

收起

自动换行

深色代码主题

复制

```
1. Slider({
2. value: this.volume,
3. min: 0,
4. max: 100,
5. step: 1,
6. style: SliderStyle.OutSet
7. })
8. .showTips(false)
9. .layoutWeight(1)
10. .onChange((value: number, mode: SliderChangeMode) => {
11. this.volume = value;
12. if (this.volume === 0) {
13. this.isSilentMode = true
14. } else {
15. this.isSilentMode = false;
16. }
17. })
```

[ControlAreaComponent.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/view/ControlAreaComponent.ets#L313-L329)

2. 使用[setVolume()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setvolume9)设置播放音量。

收起

自动换行

深色代码主题

复制

```
1. // Set Volume
2. public setVolume(volume: number) {
3. if (!this.avPlayer) {
4. Logger.info(TAG, 'avPlayer is undefined')
5. return;
6. }
7. Logger.info(TAG, `set volume is ${volume}`)
8. this.avPlayer.setVolume(volume / 100);
9. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L112-L120)

## 常见问题

### 执行AVPlayer的方法时失败，返回错误信息“Operation not allowed.”

**问题现象**

在调用AVPlayer的prepare、play、stop等方法时，会执行失败，返回错误信息“Operation not allowed.”。如以下场景。

* 设置完url、fdSrc等属性后，代码下一行就立刻执行[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，执行出错，返回错误信息“Operation not allowed.”。
* 同样，执行完[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，代码下一行立刻执行[play()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#play9)接口，执行出错，返回错误信息“Operation not allowed.”。

**可能原因**

AVPlayer的当前状态不支持此操作，执行接口前检查下当前AVPlayer的播放状态。AVPlayer播放器在执行不同的操作前，必须要保证此时处于正确的状态，比如执行播放操作前，只有当前状态在prepared/paused/completed时，才能正确执行。针对问题现象中举例的两种场景，其错误的原因可能如下。

* 设置完url、fdSrc等属性后，AVPlayer并不是就立刻进入initialized状态，如果设置完url属性后就立刻执行[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，当代码运行此行时，AVPlayer的播放状态可能还是处于idle的状态，并没有变成initialized，这时就可能产生“Operation not allowed.”的错误。
* 同样，执行完[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，AVPlayer也不是立刻进入prepared状态，如果此时立刻执行[play()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#play9)接口，AVPlayer的播放状态可能还没有变成prepared状态，执行就可能报错。

**解决方案**

1. 先了解在AVPlayer的不同播放状态下，可以执行哪些接口。熟悉AVPlayer的播放状态和不同接口间的关系，可以参考[使用AVPlayer播放视频](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback)一节中的播放状态变化示意图。

2. 保证在在正确的播放状态下，执行对应的接口。建议开发者务必注册[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)状态监听，当监听到AVPlayer的播放状态到达目标状态时，执行对应的接口。在[on('stateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#onstatechange9)中监听到AVPlayer处于initialized状态时，再执行[prepare()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#prepare9)接口，监听到AVPlayer处于prepared状态时，再执行[play()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#play9)接口。

收起

自动换行

深色代码主题

复制

```
1. // Watch state
2. private stateChangeCallback() {
3. if (!this.avPlayer) {
4. Logger.error(TAG, `stateChangeCallback , avPlayer is undefined`);
5. return;
6. }
7. this.avPlayer.on('stateChange', async (state: media.AVPlayerState, reason: media.StateChangeReason) => {
8. this.currentState = state;
9. switch (state) {
10. case 'idle':
11. Logger.info(TAG, `state idle called , resson is ${reason}`);
12. break;
13. case 'initialized':
14. Logger.info(TAG, `state initialized called , resson is ${reason}`);
15. this.setAudioRendererInfo();
16. this.prepare();
17. break;
18. case 'prepared':
19. Logger.info(TAG, `state prepared called , resson is ${reason}`);
20. if (this.waitPlay) {
21. this.play();
22. }
23. break;
24. // ...
25. }
26. });
27. Logger.info(TAG, `set stateChangeCallback success`);
28. }
```

[AVPlayerController.ets](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts/blob/master/entry/src/main/ets/common/utils/mediautils/AVPlayerController.ets#L259-L308)

## 示例代码

* [基于AVPlayer播放格式化音频（ArkTS）](https://gitcode.com/HarmonyOS_Samples/avplayer-play-formatted-audio-arkts)