HarmonyOS鸿蒙Next中AVPlayer的多音频播放策略

HarmonyOS鸿蒙Next中AVPlayer的多音频播放策略

avPlayer.audioInterruptMode = audio.InterruptMode.INDEPENDENT_MODE;

this.avPlayer.on(“audioInterrupt”, (info) => { Logger.info(TAG, info.hintType); this.pause(); })

这个是我设置的监听,我打开两个音频播放页面播放,这个回调事件没有执行,会同时存在两个音频播放

4 回复
`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支持多音频播放策略,主要通过以下方式实现:

  1. 多实例管理:创建多个AVPlayer实例,每个实例独立管理音频播放,适用于同时播放多个音频流的场景。

  2. 音频焦点管理:系统通过音频焦点机制协调多个AVPlayer实例的播放行为,如暂停或降低音量,确保用户体验。

  3. 混音支持:支持多个音频流同时输出,通过系统混音功能实现背景音乐与音效的混合播放。

开发者需合理管理AVPlayer实例,并通过监听音频焦点变化,调整播放策略,确保多音频播放的流畅性与兼容性。

回到顶部