diff --git a/zh-cn/application-dev/media/audio-renderer.md b/zh-cn/application-dev/media/audio-renderer.md index b89aaaf0c4fea4a8f1ccbdebf05512f9cb7511cf..2179c1a06e17b4bf594ef8dde767a896e510951b 100644 --- a/zh-cn/application-dev/media/audio-renderer.md +++ b/zh-cn/application-dev/media/audio-renderer.md @@ -1,28 +1,29 @@ -# AudioRenderer音频渲染开发指导 +# 音频渲染开发指导 ## 场景介绍 -AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可以通过本指导,了解如何在输出设备中播放音频文件并管理播放任务。
-同时,AudioRenderer支持音频中断的功能。
-**音频中断:** 当优先级较高的音频流需要播放时,AudioRenderer会中断优先级较低的流。例如,当用户在收听音乐时有来电,则优先级较低音乐播放将被暂停,具体可参考[开发步骤](#开发步骤)。 +AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可以通过本指导,了解如何在输出设备中播放音频文件并管理播放任务。 -## 状态检查 +同时,AudioRenderer支持音频中断的功能。 -您还应该记住,AudioRenderer 是基于状态的。 -也就是说,AudioRenderer 有一个内部状态,在调用播放控制 API 时必须始终检查它,因为某些操作仅在音频播放器处于给定状态时才可接受。 -如果您在不正确的状态下执行操作,系统可能会抛出错误/异常或生成其他未定义的行为。 +### 音频中断 -## 异步操作 +当优先级较高的音频流需要播放时,AudioRenderer会中断优先级较低的流。例如,当用户在收听音乐时有来电,则优先级较低音乐播放将被暂停,具体可参考[开发步骤](#开发步骤)。 -大多数AudioRenderer调用都是异步的。因此,UI线程不会被阻塞。
对于每个API,框架都提供callback函数和promise函数。 -在本例中,为了简单起见,使用了promise函数。[**js api audio.md**](../reference/apis/js-apis-audio.md)为callback和promise提供参考。 +### 状态检查 + +在进行应用开发的过程中,建议开发者通过on('stateChange')方法订阅AudioRenderer的状态变更。因为针对AudioRenderer的某些操作,仅在音频播放器在固定状态时才能执行。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。 + +### 异步操作 + +为保证UI线程不被阻塞,大部分AudioRenderer调用都是异步的。对于每个API均提供了callback函数和Promise函数,以下示例均采用Promise函数,更多方式可参考[js-apis-audio](../reference/apis/js-apis-audio.md#audiorenderer8)。 ## 开发步骤 1. 使用createAudioRenderer()创建一个AudioRenderer实例。 在audioCapturerOptions中设置相关参数。该实例可用于音频渲染、控制和获取采集状态,以及注册通知回调。 - ``` + ```js var audioStreamInfo = { samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, channels: audio.AudioChannel.CHANNEL_1, @@ -43,12 +44,16 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可 let audioRenderer = await audio.createAudioRenderer(audioRendererOptions); ``` - -2. 使用on('interrupt')方法订阅音频中断事件。
当优先级更高或相等的Stream-B请求激活并使用输出设备时,Stream-A被中断。 - 在某些情况下,框架会采取暂停播放、降低音量等强制操作,并通过InterruptEvent通知应用。在其他情况下,应用可以自行对InterruptEvent做出响应。
+ +2. 使用on('interrupt')方法订阅音频中断事件。 + + 当优先级更高或相等的Stream-B请求激活并使用输出设备时,Stream-A被中断。 + + 在某些情况下,框架会采取暂停播放、降低音量等强制操作,并通过InterruptEvent通知应用。在其他情况下,应用可以自行对InterruptEvent做出响应。 + 在音频中断的情况下,应用可能会碰到音频数据写入失败的问题。所以建议不感知、不处理中断的应用在写入音频数据前,使用audioRenderer.state检查播放器状态。而订阅音频中断事件,可以获取到更多详细信息,具体可参考[InterruptEvent](../reference/apis/js-apis-audio.md#interruptevent8)。 -``` + ```js audioRenderer.on('interrupt', (interruptEvent) => { console.info('InterruptEvent Received'); console.info('InterruptType: ' + interruptEvent.eventType); @@ -92,12 +97,14 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可 } } }); -``` + ``` -3. 调用start()方法来启动/恢复播放任务。 - 启动完成后,渲染器状态将变更为STATE_RUNNING,然后应用可以开始读取缓冲区。 +3. 调用start()方法来启动/恢复播放任务。 + - ``` +启动完成后,渲染器状态将变更为STATE_RUNNING,然后应用可以开始读取缓冲区。 + + ```js async function startRenderer() { var state = audioRenderer.state; // state should be prepared, paused or stopped. @@ -119,9 +126,10 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可 ``` 4. 调用write()方法向缓冲区写入数据。 + 将需要播放的音频数据读入缓冲区,重复调用write()方法写入。 - ``` + ```js async function writeBuffer(buf) { var state = audioRenderer.state; if (state != audio.AudioState.STATE_RUNNING) { @@ -166,7 +174,7 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可 5. (可选)调用pause()方法或stop()方法暂停/停止渲染音频数据。 - ``` + ```js async function pauseRenderer() { var state = audioRenderer.state; if (state != audio.AudioState.STATE_RUNNING) { @@ -203,9 +211,10 @@ AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可 ``` 6. 任务完成,调用release()方法释放相关资源。 + AudioRenderer会使用大量的系统资源,所以请确保完成相关任务后,进行资源释放。 - ``` + ```js async function releaseRenderer() { if (state_ == RELEASED || state_ == NEW) { console.info('Resourced already released');