问题背景

有其他应用在后台播放音乐时,开发者需要根据应用场景指定音频流的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中包含AudioRendererInfo,AudioRendererInfo中包含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;
  }
})

注:在设置AVPlayer的audioRendererInfo属性时,只允许在initialized状态下设置。若应用没有主动设置该属性,AVPlayer会根据媒体源是否包含视频,使用Music或Movie作为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);

HarmonyOS码上奇行
12k 声望4.5k 粉丝

欢迎关注 HarmonyOS 开发者社区:[链接]