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

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');

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

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙开发助手

赏钱一扔,代码超神,事业飞腾

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值