HarmonyOS 鸿蒙Next应用在有其它应用后台播放音乐时,如何正确选择音频流类型

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next应用在有其它应用后台播放音乐时,如何正确选择音频流类型

问题背景

有其他应用在后台播放音乐时,开发者需要根据应用场景指定音频流的StreamUsage,如果配置了不正确的StreamUsage,可能带来一些不符合预期的行为。例如以下场景:

导航场景错误使用STREAM_USAGE_MUSIC类型,导航应用播报时候会导致正在播放的音乐停止播放,而导航场景通常期望正在播放的音乐仅仅降低音量播放。

实现方案

开发者需要了解音频流类型对音频焦点管理的影响,然后根据自身的业务场景和实际需求,为音频选择合适的流类型。

例如有其他应用在后台播放音乐时,可参考下表进行选择:

应用需要播放的音频场景

打断效果

推荐流类型

闹钟

打断暂停

STREAM_USAGE_ALARM

VoIP来电响铃

STREAM_USAGE_RINGTONE

VoIP语音通话

STREAM_USAGE_VOICE_COMMUNICATION

语音短消息

STREAM_USAGE_VOICE_MESSAGE

音乐场景

打断停止

STREAM_USAGE_MUSIC

短视频、电影、电视剧

STREAM_USAGE_MOVIE

有声读物、听新闻、播客

STREAM_USAGE_AUDIOBOOK

导航

音量降低

STREAM_USAGE_NAVIGATION

通知音、提示音

STREAM_USAGE_NOTIFICATION

语音播报

STREAM_USAGE_VOICE_ASSISTANT

游戏

并发播放

STREAM_USAGE_GAME

使用SoundPool播放简短音效(点赞音、效果音等)

STREAM_USAGE_MUSIC

设置音频流类型

AudioRenderer(ArkTS)

在调用createAudioRenderer接口时,传入对应的StreamUsage

let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION,
rendererFlags: 0
};
let audioRendererOptions: audio.AudioRendererOptions = {
streamInfo: audioStreamInfo,
rendererInfo: audioRendererInfo
};
audio.createAudioRenderer(audioRendererOptions, (err, data) => {
})

注:AudioRendererOptions中包含AudioRendererInfoAudioRendererInfo中包含StreamUsage参数。

OHAudio(C/C++)

在调用OH_AudioStreamBuilder_SetRendererInfo接口时,传入对应的OH_AudioStream_Usage

OH_AudioStreamBuilder_SetRendererInfo(builder, AUDIOSTREAM_USAGE_MUSIC);

AVPlayer(ArkTS)

通过设置属性audioRendererInfo中的usage来设置音频播放流类型。

avPlayer.on(‘stateChange’, async (state: string, reason: media.StateChangeReason) => {
switch (state) {
case ‘initialized’: // avplayer 设置播放源后触发该状态上报 
console.info(‘AVPlayer state initialized called.’);
this.avPlayer.audioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
rendererFlags: 0
}
avPlayer.prepare();
break;
}
}) 

注:在设置AVPlayeraudioRendererInfo属性时,只允许在initialized状态下设置。若应用没有主动设置该属性,AVPlayer会根据媒体源是否包含视频,使用MusicMovie作为usage的默认值。

AVPlayer(C/C++)

在调用OH_AVPlayer_SetAudioRendererInfo接口时,传入对应的OH_AudioStream_Usage

OH_AVPlayer_SetAudioRendererInfo(player, AUDIOSTREAM_USAGE_MUSIC);

SoundPool(ArkTS)

在调用createSoundPool接口时,传入对应的StreamUsage

// audioRenderInfo中的参数usage取值为STREAM_USAGE_UNKNOWN,STREAM_USAGE_MUSIC,STREAM_USAGE_MOVIE,// STREAM_USAGE_AUDIOBOOK时,SoundPool播放短音时为混音模式,不会打断其他音频播放。 
let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
rendererFlags: 0
}
soundPool = await media.createSoundPool(5, audioRendererInfo);
 

1 回复

在HarmonyOS 鸿蒙Next系统中,当应用需要在有其他应用后台播放音乐时正确选择音频流类型,开发者需根据应用场景指定音频流的StreamUsage。

首先,开发者需了解音频流类型对音频焦点管理的影响,如:

  • 导航场景:通常期望正在播放的音乐降低音量播放,而非停止,因此应使用STREAM_USAGE_NAVIGATION类型。
  • 音乐场景:需要打断其他音频播放时,应使用STREAM_USAGE_MUSIC类型。
  • 电影、电视剧:应使用STREAM_USAGE_MOVIE类型。
  • 有声读物、听新闻、播客:应使用STREAM_USAGE_AUDIOBOOK类型。

在开发过程中,可通过设置AudioRendererOptions中的AudioRendererInfo的usage参数来指定音频流类型。例如,对于音乐播放,应设置为audio.StreamUsage.STREAM_USAGE_MUSIC。

此外,还需注意处理音频焦点的变更,确保应用能合理响应其他音频流的打断事件。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部