HarmonyOS 鸿蒙Next中avPlayer无法实现无缝切换音频

HarmonyOS 鸿蒙Next中avPlayer无法实现无缝切换音频 我在做一款白噪音APP,需要实现一段1分钟音频无缝循环播放,达到一直播放的效果,在切换时听不出来切换间隙,但目前avPlayer切歌会有明显间隔,导致功能无法实现,有没有什么实现思路

4 回复
private registerEvents() {
  this.avPlayer!.on('stateChange', async (state: string) => {
    switch (state) {
      case 'initialized':
        await this.avPlayer?.prepare()
        break
      case 'prepared':
        if (this.shouldAutoPlay) {
          await this.playMusic()
        }
        break
      case 'completed': // 循环播放
        await this.playMusic()
        break
    }
  })
}

async playMusic() {
  if (this.avPlayer) {
    try {
      this.avPlayer.seek(0)
      await this.avPlayer.play()
      this.isPlaying = true
    } catch (error) {
    }
  }
}

我用的avPlayer循环切换播放,感觉还可以。不过也有点延迟。

应该也可以用AudioTrack实现吧,鸿蒙有这个控件。SoundPool还是别考虑了,用起来效果更差。

更多关于HarmonyOS 鸿蒙Next中avPlayer无法实现无缝切换音频的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


短音频不应该用 avPlayer,应该用 SoundPool。

使用SoundPool播放短音频(ArkTS)-播放-媒体开发指导(ArkTS)-Media Kit(媒体服务)

SoundPool快速播放音频有破音-行业常见问题-实用工具类行业实践

使用SoundPool(音频池)提供的接口,可以实现低时延短音播放。

当应用开发时,经常需要使用一些急促简短的音效(如相机快门音效、系统通知音效等),此时建议调用SoundPool,实现一次加载,多次低时延播放。

SoundPool当前支持播放解码后1MB以下的音频资源,解码后大小超过1MB的长音频将截取前面的1MB大小数据进行播放,这相当于44.1kHz的16bit位深的立体声下约5.6秒的音频时长(在较低采样率或单声道配置下,持续时间会相应延长)。

在HarmonyOS鸿蒙Next中,avPlayer无法实现无缝切换音频,可能涉及音频会话管理机制。鸿蒙系统采用分布式音频框架,avPlayer的音频焦点处理方式与切换逻辑存在限制。当前版本中,音频资源释放与重新加载过程存在短暂中断,导致切换不连贯。可通过检查音频焦点请求策略,或尝试使用MediaSession进行统一音频控制来优化切换流程。

在HarmonyOS Next中实现音频无缝循环播放,建议采用双播放器交替缓冲的方案。通过创建两个avPlayer实例(playerA和playerB),当playerA播放至末尾前1-2秒时,预加载playerB并启动播放,同时设置精准的时间戳同步(setCurrentTime)。关键点包括:

  1. 使用on(“timeUpdate”)监听播放进度,在阈值(如剩余3秒)触发切换逻辑
  2. 通过prepare()预加载待播放器,确保音频数据就绪
  3. 切换时调用play()并精确设置setCurrentTime(0)消除延迟
  4. 注意设置相同的音频参数(采样率/声道)避免音质突变

示例核心代码:

// 双播放器交替逻辑
if (currentPlayer === playerA) {
  playerB.setSource(audioSrc);
  playerB.prepare();
  playerB.setCurrentTime(0);
  playerB.play();
  playerA.stop();
} else {
  // 反向切换
}

这种方案可有效消除切换间隙,适用于白噪音等需要连续播放的场景。注意合理设置缓冲阈值,避免过早切换造成资源浪费。

回到顶部