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