问题背景
在后台播放音乐的时候,在前台播放短视频,期望效果是视频以静音的方式起播,此时后台音乐继续播放;视频解除静音后,后台音乐停止播放;视频再次静音时,后台音乐自动恢复播放。实际效果是视频以静音的方式起播后,后台音乐被打断了;视频再次静音时,后台音乐没有恢复播放。
实现方案
需要应用在开始播放视频时,设置静音并发播放模式,设置后系统将让此音频流静音播放,并且不会打断其它音频流;否则音频流会根据系统焦点策略抢占焦点。
如果需要视频再次静音时,后台音乐可以自动恢复播放,需要应用激活音频会话(AudioSession)并指定音频会话策略为暂停模式(CONCURRENCY\_PAUSE\_OTHERS)。
静音并发播放模式的设置方法如下:
AudioRenderer(ArkTS)
调用audioRenderer.setSilentModeAndMixWithOthers(on: boolean),需要注意必须在start前设置,否则start会默认抢焦点。on设置为true,打开静音并发播放模式,系统将让此音频流静音播放,并且不会打断其它音频流;设置为false,将关闭静音并发播放,音频流可根据系统焦点策略抢占焦点。
OHAudio(C/C++)
调用OH\_AudioRenderer\_SetSilentModeAndMixWithOthers(OH\_AudioRenderer *renderer, bool on),需要注意必须在start前设置,否则start会默认抢焦点。on为true: 设置当前播放的音频流静音播放,并且不会打断其它音频流播放;on为false: 取消当前播放的音频流静音播放,音频流可根据系统焦点策略抢占焦点。
AVPlayer(ArkTS)
调用setMediaMuted(mediaType: MediaType, muted: boolean),设置muted为true,打开静音并发播放模式。
注:只能在prepared/playing/paused/completed状态下调用。仅支持设置mediaType为音频格式。
AudioSession的设置方法:
可参考如下代码:
public async setSilentModeAndMixWithOthers(isSupportSilent) {
if (isSupportSilent) {
this.audioRenderer.setSilentModeAndMixWithOthers(isSupportSilent);
// 停用AudioSession后,系统发INTERRUPT_HINT_RESUME给之前被打断的音频流
audioSessionManager.deactivateAudioSession().then(() => {
console.info('deactivateAudioSession SUCCESS');
}).catch((err: BusinessError) => {
console.error(`ERROR: ${err}`);
});
} else {
// 需要先激活AudioSession,再解除静音
let strategy: audio.AudioSessionStrategy = {
concurrencyMode: audio.AudioConcurrencyMode.CONCURRENCY_PAUSE_OTHERS
};
audioSessionManager.activateAudioSession(strategy).then(() => {
console.info('activateAudioSession SUCCESS');``
}).catch((err: BusinessError) => {
console.error(`ERROR: ${err}`);
});
this.audioRenderer.setSilentModeAndMixWithOthers(isSupportSilent);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。