基于AVPlayer播放格式化音频（ArkTS）
========================

#### 概述

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/7a/v3/KQ4-N0nuTOuYniaP06zkoA/zh-cn_image_0000002555217523.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=52DD6CD0FD311D25ECC6CBC5AF6F6DBA9F905078DBFEACEE3E8F4AC4B8290D92 "点击放大") ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/66/v3/VoVD2yDrTOOSfSobvfqBwA/zh-cn_image_0000002524217626.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=B87A22AF92B311E0BDA4F517859627FE91899CCCF3D70445ADA72EA491DDF0CF "点击放大") ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/e5/v3/auT0DHOQQkGqIbz1FVSloA/zh-cn_image_0000002555337497.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=6520B1F335A957D0F8713897DD10AA9F9B91E5E2636FF242726029D8206C1D5C "点击放大")

#### 场景分析

| 
场景名称

 | 

描述

 | 

实现方案

 |
| :-- | :-- | :-- |
| 

[基础播控](#section1764813377511)

 | 

音频资源的加载、播放、暂停、退出等操作。

 | 

使用[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)接口实现。

 |
| 

[跳转播放](#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)接口，跳转到目标时间。

 |
| 

[静音播放](#section125715278533)

 | 

点击按钮设置静音播放。

 | 

使用AVPlayer的[setMediaMuted()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#setmediamuted12)控制静音状态。

 |
| 

[切换歌曲播放](#section590418431566)

 | 

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

 | 

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

 |
| 

[倍速设置](#section189460361122)

 | 

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

 | 

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

 |
| 

[音量设置](#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)。本篇文章不再赘述。

 |

#### 基础播控

#### \[h2\]场景描述

通过[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/99/v3/yCMYsyeCSj2VQNPn8m7TzQ/zh-cn_image_0000002524057632.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=CFAA994B961D9024C1965BCEDA4C400666ED8185660A3BFDD16C972D559ED4F4 "点击放大")

#### \[h2\]实现原理

核心原理是使用[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)回调，主动获取当前状态变化。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f5/v3/e_oexcVPQTiXPui2H-Jj6Q/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=4778DD7BFB3FA4B40775CA32E87C15829F17204436B6B349F0E26C1E6F317C98)
    
    因为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)接口，播放音频资源。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f1/v3/ehHmwrfhTeaRg2YI79Iu6w/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=FDB01EDB42066FC603ED7AF2C9D09383E85F306E94BADFDC604462E70D5C202D)
    
    第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)，销毁播放资源。
    

#### \[h2\]开发步骤

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

// Initialize the player
public async initAVPlayer() {
  if (this.avPlayer) {
    Logger.info(TAG, 'avPlayer already created');
    return;
  }
  this.avPlayer = await media.createAVPlayer();
  this.genSpeedMap();
  Logger.info(TAG, \`createAVPlayer success， curState is ${this.avPlayer?.state}\`);
  this.setAVPlayerCallbacks();
  Logger.info(TAG, \`setAVPlayerCallbacks success，curState is ${this.avPlayer?.state}\`);
}

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

// Watch state
private stateChangeCallback() {
  if (!this.avPlayer) {
    Logger.error(TAG, \`stateChangeCallback , avPlayer is undefined\`);
    return;
  }
  this.avPlayer.on('stateChange', async (state: media.AVPlayerState, reason: media.StateChangeReason) => {
    this.currentState = state;
    switch (state) {
      case 'idle':
        Logger.info(TAG, \`state idle called , resson is ${reason}\`);
        break;
      case 'initialized':
        Logger.info(TAG, \`state initialized called , resson is ${reason}\`);
        this.setAudioRendererInfo();
        this.prepare();
        break;
      case 'prepared':
        Logger.info(TAG, \`state prepared called , resson is ${reason}\`);
        if (this.waitPlay) {
          this.play();
        }
        break;
      // ...
    }
  });
  Logger.info(TAG, \`set stateChangeCallback success\`);
}

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

private errorCallback() {
  if (!this.avPlayer) {
    return;
  }
  this.avPlayer.on('error', (error: BusinessError) => {
    Logger.error(TAG, \`errorCallback , code is ${error.code} message is ${error.message}\`);
  });
}

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#属性)等属性设置播放资源。

async loadSongAssent(songRawFileDescriptor: resourceManager.RawFileDescriptor) {
  if (!songRawFileDescriptor) {
    Logger.error(TAG, \`loadSongAssent faile : songRawFileDescriptor get failed\`);
    return;
  }
  if (!this.avPlayer) {
    return;
  }
  this.avPlayer.fdSrc = songRawFileDescriptor;
  Logger.info(TAG, \`set avPlayer url is ${this.avPlayer.fdSrc}，curState is ${this.avPlayer?.state}\`);
}

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

// Prepare the player
public async prepare() {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  await this.avPlayer.prepare().then(() => {
    Logger.info(TAG, \`prepare success , curState is ${this.avPlayer?.state}\`);
    AppStorage.setOrCreate('totalTime', MediaTools.msToCountdownTime(this.avPlayer?.duration!));
    AppStorage.setOrCreate('totalMsTime', this.avPlayer?.duration!);
    AppStorage.setOrCreate('progressMax', this.avPlayer?.duration!);
  });
}

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

public async play() {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  if (this.currentState !== 'prepared' && this.currentState !== 'paused' && this.currentState !== 'stopped' &&
    this.currentState !== 'completed') {
    this.waitPlay = true;
    Logger.info(TAG, 'avPlayer current playState is not prepared')
    return;
  }
  await this.avPlayer.play();
  this.waitPlay = false;
  Logger.info(TAG, 'play success');
  this.updateIsPlay(true);
  Logger.info(TAG, \`curState is ${this.avPlayer?.state}\`);
}

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

public pause() {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  this.avPlayer.pause();
  this.updateIsPlay(false);
}

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

public async stop() {
  if (!this.avPlayer) {
    Logger.error(TAG, 'avPlayer is undefined')
    return;
  }
  await this.avPlayer.stop();
  await this.avPlayer.reset();
  Logger.info(TAG, 'avPlayer stop success')
}

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

public release() {
  if (!this.avPlayer) {
    Logger.error(TAG, 'avPlayer is undefined')
    return;
  }
  this.avPlayer.release();
  Logger.error(TAG, 'avPlayer release success');
}

#### 跳转播放

#### \[h2\]场景描述

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2e/v3/V3lsTsuQQuK0Nf3mXZRKHA/zh-cn_image_0000002555217525.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=7CB50DF9A1FD5E58C133B1CD70D6EA501FCE4C5AE4E5E3A4652FA922C1FD92BD "点击放大")

#### \[h2\]实现原理

使用[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)接口，跳转到目标时间。

#### \[h2\]开发步骤

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

public seek(ms: number) {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  this.avPlayer.seek(ms);
}

#### 静音播放

#### \[h2\]场景描述

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ab/v3/e-dNJYlxT3q5sH3oOStAHA/zh-cn_image_0000002524217628.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=F50820F6DA3E621C7EAE3685A8A1BEDA38CD57C06A7022FFED9184F7A84DEE4C "点击放大")

#### \[h2\]实现原理

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

#### \[h2\]开发步骤

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

public setSilentMode(isSilentMode: boolean) {
  if (!this.avPlayer) {
    Logger.error(TAG, 'avPlayer is undefined')
    return;
  }
  this.avPlayer.setMediaMuted(media.MediaType.MEDIA\_TYPE\_AUD, isSilentMode);
  Logger.info(TAG, \`avPlayer setMediaMuted is ${isSilentMode} success\`)
}

#### 切换歌曲播放

#### \[h2\]场景描述

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8b/v3/3B1w-e0SSXuw2tBmJSArdQ/zh-cn_image_0000002555337501.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=1023C22CF77E8AE37147983A7CB6EE225147FE34F40800F931AF5F5796B9302F "点击放大")

#### \[h2\]实现原理

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

#### \[h2\]开发步骤

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

public async stop() {
  if (!this.avPlayer) {
    Logger.error(TAG, 'avPlayer is undefined')
    return;
  }
  await this.avPlayer.stop();
  await this.avPlayer.reset();
  Logger.info(TAG, 'avPlayer stop success')
}

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

async loadSongAssent(songRawFileDescriptor: resourceManager.RawFileDescriptor) {
  if (!songRawFileDescriptor) {
    Logger.error(TAG, \`loadSongAssent faile : songRawFileDescriptor get failed\`);
    return;
  }
  if (!this.avPlayer) {
    return;
  }
  this.avPlayer.fdSrc = songRawFileDescriptor;
  Logger.info(TAG, \`set avPlayer url is ${this.avPlayer.fdSrc}，curState is ${this.avPlayer?.state}\`);
}

#### 倍速设置

#### \[h2\]场景描述

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/bc/v3/2gMoAqUESVCA1oN7_PXzmw/zh-cn_image_0000002524057634.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=F4567D21795C3444E824D23C5B8FC090B0CCD54F0124700BBAE9F00D06A3EAE3 "点击放大")

#### \[h2\]实现原理

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

#### \[h2\]开发步骤

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

Slider({
  value: this.speed,
  min: 0.25,
  max: 2,
  step: 0.25,
  style: SliderStyle.OutSet
})
  .layoutWeight(1)
  .showTips(true, this.speed.toString())
  .showSteps(true)
  .onChange((value: number, mode: SliderChangeMode) => {
    this.speed = value;
    MediaControlCenter.getInstance().setSpeed(this.speed);
    console.info('value:' + value + 'mode:' + mode.toString());
  })

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

// Set Speed
public setSpeed(speed: number) {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  Logger.info(TAG, \`set speed is ${speed}\`)
  this.avPlayer.setSpeed(this.switchSpeed(speed));
}

#### 音量设置

#### \[h2\]场景描述

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/64/v3/YeLlD517T5CCPxhaIdwa-g/zh-cn_image_0000002555217531.gif?HW-CC-KV=V1&HW-CC-Date=20260612T074604Z&HW-CC-Expire=86400&HW-CC-Sign=7A8C1886D2C47F8675E4D41BCC3BD6AF399AC01F7C80D85378F0AEACD677F87F "点击放大")

#### \[h2\]实现原理

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

#### \[h2\]开发步骤

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

Slider({
  value: this.volume,
  min: 0,
  max: 100,
  step: 1,
  style: SliderStyle.OutSet
})
  .showTips(false)
  .layoutWeight(1)
  .onChange((value: number, mode: SliderChangeMode) => {
    this.volume = value;
    if (this.volume === 0) {
      this.isSilentMode = true
    } else {
      this.isSilentMode = false;
    }
  })

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

// Set Volume
public setVolume(volume: number) {
  if (!this.avPlayer) {
    Logger.info(TAG, 'avPlayer is undefined')
    return;
  }
  Logger.info(TAG, \`set volume is ${volume}\`)
  this.avPlayer.setVolume(volume / 100);
}

#### 常见问题

#### \[h2\]执行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)接口。

// Watch state
private stateChangeCallback() {
  if (!this.avPlayer) {
    Logger.error(TAG, \`stateChangeCallback , avPlayer is undefined\`);
    return;
  }
  this.avPlayer.on('stateChange', async (state: media.AVPlayerState, reason: media.StateChangeReason) => {
    this.currentState = state;
    switch (state) {
      case 'idle':
        Logger.info(TAG, \`state idle called , resson is ${reason}\`);
        break;
      case 'initialized':
        Logger.info(TAG, \`state initialized called , resson is ${reason}\`);
        this.setAudioRendererInfo();
        this.prepare();
        break;
      case 'prepared':
        Logger.info(TAG, \`state prepared called , resson is ${reason}\`);
        if (this.waitPlay) {
          this.play();
        }
        break;
      // ...
    }
  });
  Logger.info(TAG, \`set stateChangeCallback success\`);
}

#### 示例代码

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