Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
ca0bc721
D
Docs
项目概览
OpenHarmony
/
Docs
大约 1 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
ca0bc721
编写于
3月 19, 2022
作者:
Z
zengyawen
提交者:
Gitee
3月 19, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
重复语句修改
Signed-off-by:
N
zengyawen
<
zengyawen1@huawei.com
>
上级
c04eac70
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
23 deletion
+32
-23
zh-cn/application-dev/media/audio-renderer.md
zh-cn/application-dev/media/audio-renderer.md
+32
-23
未找到文件。
zh-cn/application-dev/media/audio-renderer.md
浏览文件 @
ca0bc721
#
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录