写点什么

鸿蒙开发之音频播放开发技术文档

作者:彭康佳
  • 2024-06-21
    广东
  • 本文字数:4504 字

    阅读完需:约 15 分钟

1. 音频播放开发方式选择

在开发音频播放应用时,可以根据应用的需求选择合适的 API。以下是几种常用的音频播放 API 及其适用场景:


  • AudioRenderer:适用于需要专业处理音频数据的应用,支持 PCM 格式,需要应用持续写入音频数据。

  • AudioHaptic:适用于音振协同播放,如来电铃声随振、键盘按键反馈等。

  • OpenSL ES:跨平台的音频 Native API,支持 PCM 格式,适用于从其他平台移植或依赖 Native 层实现音频输出的应用。

  • OHAudio:支持普通音频通路和低时延通路的 Native API,适用于依赖 Native 层实现音频输出的场景。

  • AVPlayer:集成了流媒体和本地资源解析、解封装、解码和输出功能的 API,支持 mp3、m4a 等格式,不支持 PCM 格式。

  • SoundPool:适用于播放急促简短音效的 API,如相机快门音效、按键音效等。

2. 开发音频播放应用须知

为了实现后台播放或熄屏播放,开发者需要:


  1. 使用媒体会话功能注册到系统内统一管理,参考AVSession Kit开发指导

  2. 申请长时任务避免进入挂起状态,参考Background Tasks Kit开发指导

3. 使用 AudioRenderer 开发音频播放功能

3.1 配置音频渲染参数并创建 AudioRenderer 实例

首先,配置音频渲染参数,包括采样率、通道、采样格式和编码格式等,然后使用createAudioRenderer()方法创建 AudioRenderer 实例。


let audioStreamInfo = {  samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,  channels: audio.AudioChannel.CHANNEL_2,  sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,  encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW};
let audioRendererInfo = { usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, rendererFlags: 0};
let audioRendererOptions = { streamInfo: audioStreamInfo, rendererInfo: audioRendererInfo};
audio.createAudioRenderer(audioRendererOptions, (err, data) => { if (err) { console.error(`Invoke createAudioRenderer failed, code is ${err.code}, message is ${err.message}`); } else { console.info('Invoke createAudioRenderer succeeded.'); let audioRenderer = data; }});
复制代码

3.2 订阅监听音频数据写入回调

使用on('writeData')方法监听音频数据写入。


let writeDataCallback = (buffer: ArrayBuffer) => {  // 读取音频数据到缓冲区};
audioRenderer.on('writeData', writeDataCallback);
复制代码

3.3 开始渲染音频

调用start()方法开始渲染音频。


audioRenderer.start((err: BusinessError) => {  if (err) {    console.error(`Renderer start failed, code is ${err.code}, message is ${err.message}`);  } else {    console.info('Renderer start success.');  }});
复制代码

3.4 停止渲染

调用stop()方法停止渲染。


audioRenderer.stop((err: BusinessError) => {  if (err) {    console.error(`Renderer stop failed, code is ${err.code}, message is ${err.message}`);  } else {    console.info('Renderer stopped.');  }});
复制代码

3.5 销毁实例,释放资源

调用release()方法释放所有占用的硬件和软件资源。


audioRenderer.release((err: BusinessError) => {  if (err) {    console.error(`Renderer release failed, code is ${err.code}, message is ${err.message}`);  } else {    console.info('Renderer released.');  }});
复制代码

4. 音视频播放器使用步骤及知识点

4.1 创建 AVPlayer 实例

使用createAVPlayer()方法创建 AVPlayer 实例。


media.createAVPlayer((error: BusinessError, video: media.AVPlayer) => {  if (video != null) {    avPlayer = video;    console.info('createAVPlayer success');  } else {    console.error(`createAVPlayer fail, error message:${error.message}`);  }});
复制代码

4.2 设置监听事件

监听事件包括状态变化、错误信息、资源时长更新、当前时间更新等。


avPlayer.on('stateChange', (state: AVPlayerState, reason: StateChangeReason) => {  // 处理状态变化});
复制代码

4.3 设置资源

设置属性 url,AVPlayer 进入 initialized 状态。


avPlayer.url = '媒体URL';
复制代码

4.4 设置窗口

获取并设置属性 SurfaceID,用于设置显示画面。


avPlayer.surfaceId = '视频窗口ID';
复制代码

4.5 准备播放

调用prepare()方法,AVPlayer 进入 prepared 状态。


avPlayer.prepare((err: BusinessError) => {  if (err == null) {    console.info('prepare success');  } else {    console.error('prepare filed,error message is :' + err.message);  }});
复制代码

4.6 视频播放控制

使用play()pause()seek()stop()等方法进行播放控制。


avPlayer.play((err: BusinessError) => {  if (err == null) {    console.info('play success');  } else {    console.error('play filed,error message is :' + err.message);  }});
复制代码

4.7 更换资源

调用reset()方法重置资源,AVPlayer 重新进入 idle 状态。


avPlayer.reset((err: BusinessError) => {  if (err == null) {    console.info('reset success');  } else {    console.error('reset filed,error message is :' + err.message);  }});
复制代码

4.8 退出播放

调用release()方法销毁实例,AVPlayer 进入 released 状态。


avPlayer.release((err: BusinessError) => {  if (err == null) {    console.info('release success');  } else {    console.error('release filed,error message is :' + err.message);  }});
复制代码

5. 音视频播放状态查询与控制

5.1 查询播放状态

使用state属性查询播放状态。


let state = avPlayer.state;
复制代码

5.2 查询当前播放时间

使用currentTime属性查询当前播放时间。


let currentTime = avPlayer.currentTime;
复制代码

5.3 查询视频时长

使用duration属性查询视频时长。


let duration = avPlayer.duration;
复制代码

5.4 查询视频宽度与高度

使用widthheight属性查询视频的宽度和高度。


let width = avPlayer.width;let height = avPlayer.height;
复制代码

5.5 跳转到指定播放位置

使用seek()方法跳转到指定播放位置。


avPlayer.seek(1000, media.SeekMode.SEEK_PREV_SYNC);
复制代码

5.6 设置倍速模式

使用setSpeed()方法设置倍速模式。


avPlayer.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_2_00_X);
复制代码

5.7 设置比特率

使用setBitrate()方法设置比特率。


avPlayer.setBitrate(96000);
复制代码

5.8 设置音量

使用setVolume()方法设置音量。


avPlayer.setVolume(1.0);
复制代码

5.9 监听播放事件

为了更好地控制和管理音视频播放,可以监听以下事件:

5.9.1 监听资源播放当前时间 (on('timeUpdate'))

使用 on('timeUpdate', callback: Callback<number>): void 方法监听资源播放的当前时间,单位为毫秒。


avPlayer.on('timeUpdate', (time:number) => {  console.info('timeUpdate success,and new time is :' + time)})
复制代码

5.9.2 取消监听资源播放当前时间 (off('timeUpdate'))

使用 off(type: 'timeUpdate'): void 方法取消监听资源播放的当前时间。


avPlayer.off('timeUpdate')
复制代码

5.9.3 监听资源播放资源的时长 (on('durationUpdate'))

使用 on(type: 'durationUpdate', callback: Callback<number>): void 方法监听资源播放的时长,单位为毫秒。


avPlayer.on('durationUpdate', (duration: number) => {  console.info('durationUpdate success,new duration is :' + duration)})
复制代码

5.9.4 取消监听资源播放资源的时长 (off('durationUpdate'))

使用 off(type: 'durationUpdate'): void 方法取消监听资源播放的时长。


avPlayer.off('durationUpdate')
复制代码

5.9.5 订阅音视频缓存更新事件 (on('bufferingUpdate'))

使用 on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void 方法订阅音视频缓存更新事件。


avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => {  console.info('bufferingUpdate success,and infoType value is:' + infoType + ', value is :' + value)})
复制代码

5.9.6 取消监听音视频缓存更新事件 (off('bufferingUpdate'))

使用 off(type: 'bufferingUpdate'): void 方法取消监听音视频缓存更新事件。


avPlayer.off('bufferingUpdate')
复制代码

5.9.7 订阅视频播放开始首帧渲染的更新事件 (on('startRenderFrame'))

使用 on(type: 'startRenderFrame', callback: Callback<void>): void 方法订阅视频播放开始首帧渲染的更新事件。


avPlayer.on('startRenderFrame', () => {  console.info('startRenderFrame success')})
复制代码

5.9.8 取消监听视频播放开始首帧渲染的更新事件 (off('startRenderFrame'))

使用 off(type: 'startRenderFrame'): void 方法取消监听视频播放开始首帧渲染的更新事件。


avPlayer.off('startRenderFrame')
复制代码

5.9.9 监听视频播放宽高变化事件 (on('videoSizeChange'))

使用 on(type: 'videoSizeChange', callback: (width: number, height: number) => void): void 方法监听视频播放宽高变化事件。


avPlayer.on('videoSizeChange', (width: number, height: number) => {  console.info('videoSizeChange success,and width is:' + width + ', height is :' + height)})
复制代码

5.9.10 取消监听视频播放宽高变化事件 (off('videoSizeChange'))

使用 off(type: 'videoSizeChange'): void 方法取消监听视频播放宽高变化事件。


avPlayer.off('videoSizeChange')
复制代码

5.9.11 监听音频焦点变化事件 (on('audioInterrupt'))

使用 on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void 方法监听音频焦点变化事件。


import audio from '@ohos.multimedia.audio';avPlayer.on('audioInterrupt', (info: audio.InterruptEvent) => {  console.info('audioInterrupt success,and InterruptEvent info is:' + info)})
复制代码

5.9.12 取消监听音频焦点变化事件 (off('audioInterrupt'))

使用 off(type: 'audioInterrupt'): void 方法取消监听音频焦点变化事件。


avPlayer.off('audioInterrupt')
复制代码

5.9.13 订阅监听音频流输出设备变化及原因 (on('audioOutputDeviceChangeWithInfo'))

使用 on(type: 'audioOutputDeviceChangeWithInfo', callback: Callback<audio.AudioStreamDeviceChangeInfo>): void 方法订阅监听音频流输出设备变化及原因。


import audio from '@ohos.multimedia.audio';avPlayer.on('audioOutputDeviceChangeWithInfo', (data: audio.AudioStreamDeviceChangeInfo) => {  console.info(`${JSON.stringify(data)}`);});
复制代码

5.9.14 取消订阅监听音频流输出设备变化及原因 (off('audioOutputDeviceChangeWithInfo'))

使用 off(type: 'audioOutputDeviceChangeWithInfo', callback?: Callback<audio.AudioStreamDeviceChangeInfo>): void 方法取消订阅监听音频流输出设备变化及原因。


avPlayer.off('audioOutputDeviceChangeWithInfo');
复制代码


以上是关于如何使用音视频播放器的详细知识点的总结,包括了创建播放实例、控制播放、设置播放属性、查询播放状态以及监听播放事件的步骤和代码示例。这些内容将帮助开发者更好地理解和使用音视频播放器,实现高效稳定的音视频播放功能。

发布于: 刚刚阅读数: 5
用户头像

彭康佳

关注

还未添加个人签名 2018-12-19 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙开发之音频播放开发技术文档_鸿蒙_彭康佳_InfoQ写作社区