HarmonyOS鸿蒙Next中AVPlayer的多音频播放策略
HarmonyOS鸿蒙Next中AVPlayer的多音频播放策略
avPlayer.audioInterruptMode = audio.InterruptMode.INDEPENDENT_MODE;
this.avPlayer.on(“audioInterrupt”, (info) => { Logger.info(TAG, info.hintType); this.pause(); })
这个是我设置的监听,我打开两个音频播放页面播放,这个回调事件没有执行,会同时存在两个音频播放
`audioInterruptMode` 属性允许开发者设置音频播放器在音频焦点被中断时的处理策略。这玩意儿也不是多音音频播放策略啊
更多关于HarmonyOS鸿蒙Next中AVPlayer的多音频播放策略的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
需要注意下设置音频焦点模式的时间点,只允许在prepared/playing/paused/completed状态下设置,且需要在第一次调用play()之前设置;
import { media } from '@kit.MediaKit';
import { audio } from '@kit.AudioKit';
let player1: media.AVPlayer;
let player2: media.AVPlayer;
async function play1() {
let fileDescriptor = getContext().resourceManager.getRawFdSync(audio/boisterous.wav);
let avFileDescriptor: media.AVFileDescriptor = {
fd: fileDescriptor.fd,
offset: fileDescriptor.offset,
length: fileDescriptor.length
};
player1 = await media.createAVPlayer();
player1.fdSrc = avFileDescriptor;
setAVPlayerCallback(player1);
}
async function play2() {
let fileDescriptor = getContext().resourceManager.getRawFdSync(audio/bootsound.wav);
let avFileDescriptor: media.AVFileDescriptor = {
fd: fileDescriptor.fd,
offset: fileDescriptor.offset,
length: fileDescriptor.length
};
player2 = await media.createAVPlayer();
player2.fdSrc = avFileDescriptor;
setAVPlayerCallback(player2);
}
// 注册avplayer回调函数
function setAVPlayerCallback(avPlayer: media.AVPlayer) {
if (avPlayer == null) {
return;
}
avPlayer.on('audioInterrupt', (info: audio.InterruptEvent) => {
console.info('audioInterrupt success,and InterruptEvent info is:' + JSON.stringify(info))
})
// 状态机变化回调函数
avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
switch (state) {
case 'idle': // 成功调用reset接口后触发该状态机上报
console.info('AVPlayer state idle called.');
avPlayer.release();
break;
case 'initialized': // avplayer 设置播放源后触发该状态上报
console.info('AVPlayer state initialized called.');
avPlayer.prepare();
break;
case 'prepared': // prepare调用成功后上报该状态机
console.info('AVPlayer state prepared called.');
avPlayer.audioInterruptMode = audio.InterruptMode.INDEPENDENT_MODE;
avPlayer.play(); // 调用播放接口开始播放
break;
case 'playing': // play成功调用后触发该状态机上报
console.info('AVPlayer state playing called.');
break;
case 'paused': // pause成功调用后触发该状态机上报
console.info('AVPlayer state paused called.');
break;
case 'completed': // 播放结束后触发该状态机上报
console.info('AVPlayer state completed called.');
break;
case 'stopped': // stop接口成功调用后触发该状态机上报
console.info('AVPlayer state stopped called.');
break;
case 'released':
console.info('AVPlayer state released called.');
break;
default:
console.info('AVPlayer state unknown called.');
break;
}
})
}
@Entry
@Component
struct AVPlayerPage {
@State message: string = 'Hello World';
build() {
Row() {
Column() {
Button("播放音频1")
.onClick(() => {
play1();
})
Button("播放音频2")
.onClick(() => {
play2();
})
}
.width('100%')
}
.height('100%')
}
}
在HarmonyOS鸿蒙Next中,AVPlayer的多音频播放策略主要依赖于系统的音频管理机制和AVPlayer的API设计。鸿蒙Next通过HDF(Hardware Driver Foundation)和Audio Service来管理音频资源,确保多个音频流的并发播放。
AVPlayer在鸿蒙Next中支持多实例播放,每个实例可以独立控制音频流的播放、暂停、停止等操作。系统通过音频焦点管理机制来协调多个音频流的播放行为。当一个AVPlayer实例请求音频焦点时,系统会根据优先级和当前音频焦点的状态来决定是否授予焦点。如果焦点被授予,该实例可以正常播放音频;如果焦点被其他高优先级实例占用,系统会暂停或降低当前实例的音量。
鸿蒙Next还提供了音频混音功能,允许多个音频流在硬件支持的情况下同时播放。AVPlayer可以通过设置音频会话的类别(如AudioSessionCategory.Media)来指定音频流的用途,系统会根据类别和应用场景进行混音处理。
此外,AVPlayer还支持音频流的音量独立控制,开发者可以通过API调整单个音频流的音量,而不影响其他音频流的播放。这种设计在多音频播放场景下提供了更灵活的音频管理能力。
总结来说,鸿蒙Next中AVPlayer的多音频播放策略通过音频焦点管理、音频混音和独立音量控制等机制,实现了多音频流的高效并发处理。
在HarmonyOS鸿蒙Next中,AVPlayer支持多音频播放策略,主要通过以下方式实现:
-
多实例管理:创建多个AVPlayer实例,每个实例独立管理音频播放,适用于同时播放多个音频流的场景。
-
音频焦点管理:系统通过音频焦点机制协调多个AVPlayer实例的播放行为,如暂停或降低音量,确保用户体验。
-
混音支持:支持多个音频流同时输出,通过系统混音功能实现背景音乐与音效的混合播放。
开发者需合理管理AVPlayer实例,并通过监听音频焦点变化,调整播放策略,确保多音频播放的流畅性与兼容性。

