未验证 提交 ca0bc721 编写于 作者: Z zengyawen 提交者: Gitee

重复语句修改

Signed-off-by: Nzengyawen <zengyawen1@huawei.com>
上级 c04eac70
# AudioRenderer音频渲染开发指导
# 音频渲染开发指导
## 场景介绍
AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可以通过本指导,了解如何在输出设备中播放音频文件并管理播放任务。<br/>
同时,AudioRenderer支持音频中断的功能。<br/>
**音频中断:** 当优先级较高的音频流需要播放时,AudioRenderer会中断优先级较低的流。例如,当用户在收听音乐时有来电,则优先级较低音乐播放将被暂停,具体可参考[开发步骤](#开发步骤)。
AudioRenderer提供了渲染音频文件和控制播放的接口,开发者可以通过本指导,了解如何在输出设备中播放音频文件并管理播放任务。
## 状态检查
同时,AudioRenderer支持音频中断的功能。
您还应该记住,AudioRenderer 是基于状态的。
也就是说,AudioRenderer 有一个内部状态,在调用播放控制 API 时必须始终检查它,因为某些操作仅在音频播放器处于给定状态时才可接受。
如果您在不正确的状态下执行操作,系统可能会抛出错误/异常或生成其他未定义的行为。
### 音频中断
## 异步操作
当优先级较高的音频流需要播放时,AudioRenderer会中断优先级较低的流。例如,当用户在收听音乐时有来电,则优先级较低音乐播放将被暂停,具体可参考[开发步骤](#开发步骤)
大多数AudioRenderer调用都是异步的。因此,UI线程不会被阻塞。<br/>对于每个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')方法订阅音频中断事件。<br/>当优先级更高或相等的Stream-B请求激活并使用输出设备时,Stream-A被中断。
在某些情况下,框架会采取暂停播放、降低音量等强制操作,并通过InterruptEvent通知应用。在其他情况下,应用可以自行对InterruptEvent做出响应。<br/>
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');
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册