鸿蒙开发之音频播放开发技术文档
1. 音频播放开发方式选择
在开发音频播放应用时,可以根据应用的需求选择合适的 API。以下是几种常用的音频播放 API 及其适用场景:
AudioRenderer:适用于需要专业处理音频数据的应用,支持 PCM 格式,需要应用持续写入音频数据。
AudioHaptic:适用于音振协同播放,如来电铃声随振、键盘按键反馈等。
OpenSL ES:跨平台的音频 Native API,支持 PCM 格式,适用于从其他平台移植或依赖 Native 层实现音频输出的应用。
OHAudio:支持普通音频通路和低时延通路的 Native API,适用于依赖 Native 层实现音频输出的场景。
AVPlayer:集成了流媒体和本地资源解析、解封装、解码和输出功能的 API,支持 mp3、m4a 等格式,不支持 PCM 格式。
SoundPool:适用于播放急促简短音效的 API,如相机快门音效、按键音效等。
2. 开发音频播放应用须知
为了实现后台播放或熄屏播放,开发者需要:
使用媒体会话功能注册到系统内统一管理,参考AVSession Kit开发指导。
申请长时任务避免进入挂起状态,参考Background Tasks Kit开发指导。
3. 使用 AudioRenderer 开发音频播放功能
3.1 配置音频渲染参数并创建 AudioRenderer 实例
首先,配置音频渲染参数,包括采样率、通道、采样格式和编码格式等,然后使用createAudioRenderer()
方法创建 AudioRenderer 实例。
3.2 订阅监听音频数据写入回调
使用on('writeData')
方法监听音频数据写入。
3.3 开始渲染音频
调用start()
方法开始渲染音频。
3.4 停止渲染
调用stop()
方法停止渲染。
3.5 销毁实例,释放资源
调用release()
方法释放所有占用的硬件和软件资源。
4. 音视频播放器使用步骤及知识点
4.1 创建 AVPlayer 实例
使用createAVPlayer()
方法创建 AVPlayer 实例。
4.2 设置监听事件
监听事件包括状态变化、错误信息、资源时长更新、当前时间更新等。
4.3 设置资源
设置属性 url,AVPlayer 进入 initialized 状态。
4.4 设置窗口
获取并设置属性 SurfaceID,用于设置显示画面。
4.5 准备播放
调用prepare()
方法,AVPlayer 进入 prepared 状态。
4.6 视频播放控制
使用play()
、pause()
、seek()
、stop()
等方法进行播放控制。
4.7 更换资源
调用reset()
方法重置资源,AVPlayer 重新进入 idle 状态。
4.8 退出播放
调用release()
方法销毁实例,AVPlayer 进入 released 状态。
5. 音视频播放状态查询与控制
5.1 查询播放状态
使用state
属性查询播放状态。
5.2 查询当前播放时间
使用currentTime
属性查询当前播放时间。
5.3 查询视频时长
使用duration
属性查询视频时长。
5.4 查询视频宽度与高度
使用width
和height
属性查询视频的宽度和高度。
5.5 跳转到指定播放位置
使用seek()
方法跳转到指定播放位置。
5.6 设置倍速模式
使用setSpeed()
方法设置倍速模式。
5.7 设置比特率
使用setBitrate()
方法设置比特率。
5.8 设置音量
使用setVolume()
方法设置音量。
5.9 监听播放事件
为了更好地控制和管理音视频播放,可以监听以下事件:
5.9.1 监听资源播放当前时间 (on('timeUpdate')
)
使用 on('timeUpdate', callback: Callback<number>): void
方法监听资源播放的当前时间,单位为毫秒。
5.9.2 取消监听资源播放当前时间 (off('timeUpdate')
)
使用 off(type: 'timeUpdate'): void
方法取消监听资源播放的当前时间。
5.9.3 监听资源播放资源的时长 (on('durationUpdate')
)
使用 on(type: 'durationUpdate', callback: Callback<number>): void
方法监听资源播放的时长,单位为毫秒。
5.9.4 取消监听资源播放资源的时长 (off('durationUpdate')
)
使用 off(type: 'durationUpdate'): void
方法取消监听资源播放的时长。
5.9.5 订阅音视频缓存更新事件 (on('bufferingUpdate')
)
使用 on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void
方法订阅音视频缓存更新事件。
5.9.6 取消监听音视频缓存更新事件 (off('bufferingUpdate')
)
使用 off(type: 'bufferingUpdate'): void
方法取消监听音视频缓存更新事件。
5.9.7 订阅视频播放开始首帧渲染的更新事件 (on('startRenderFrame')
)
使用 on(type: 'startRenderFrame', callback: Callback<void>): void
方法订阅视频播放开始首帧渲染的更新事件。
5.9.8 取消监听视频播放开始首帧渲染的更新事件 (off('startRenderFrame')
)
使用 off(type: 'startRenderFrame'): void
方法取消监听视频播放开始首帧渲染的更新事件。
5.9.9 监听视频播放宽高变化事件 (on('videoSizeChange')
)
使用 on(type: 'videoSizeChange', callback: (width: number, height: number) => void): void
方法监听视频播放宽高变化事件。
5.9.10 取消监听视频播放宽高变化事件 (off('videoSizeChange')
)
使用 off(type: 'videoSizeChange'): void
方法取消监听视频播放宽高变化事件。
5.9.11 监听音频焦点变化事件 (on('audioInterrupt')
)
使用 on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void
方法监听音频焦点变化事件。
5.9.12 取消监听音频焦点变化事件 (off('audioInterrupt')
)
使用 off(type: 'audioInterrupt'): void
方法取消监听音频焦点变化事件。
5.9.13 订阅监听音频流输出设备变化及原因 (on('audioOutputDeviceChangeWithInfo')
)
使用 on(type: 'audioOutputDeviceChangeWithInfo', callback: Callback<audio.AudioStreamDeviceChangeInfo>): void
方法订阅监听音频流输出设备变化及原因。
5.9.14 取消订阅监听音频流输出设备变化及原因 (off('audioOutputDeviceChangeWithInfo')
)
使用 off(type: 'audioOutputDeviceChangeWithInfo', callback?: Callback<audio.AudioStreamDeviceChangeInfo>): void
方法取消订阅监听音频流输出设备变化及原因。
以上是关于如何使用音视频播放器的详细知识点的总结,包括了创建播放实例、控制播放、设置播放属性、查询播放状态以及监听播放事件的步骤和代码示例。这些内容将帮助开发者更好地理解和使用音视频播放器,实现高效稳定的音视频播放功能。
版权声明: 本文为 InfoQ 作者【彭康佳】的原创文章。
原文链接:【http://xie.infoq.cn/article/2f6efb112482831d33a6f5953】。文章转载请联系作者。
评论