HarmonyOS鸿蒙Next中如何解决AVPlayer做音乐播放器,切换音乐无法播放问题

HarmonyOS鸿蒙Next中如何解决AVPlayer做音乐播放器,切换音乐无法播放问题

【问题现象】

音乐播放完后自动切换下一首进行播放,此时待播放音乐正在缓冲中,手动点击下一首无法正常播放,如下:

点击放大

【背景知识】

播放管理AVPlayer:播放管理类,用于管理和播放媒体资源。

AVPlayer播放音频(ArkTS):音频播放示例。

【定位思路】

音乐播放结束后切换下一首播放,需要重置AVPlayer的媒体资源,AVPlayer的当前状态和媒体资源都有可能导致无法播放。

  1. 确认当前AVPlayer的状态是否为idle状态;

    媒体资源只允许在idle状态下设置。AVPlayer刚被创建createAVPlayer()或者调用了reset()方法之后,进入idle状态。

    点击放大

  2. 确认媒体资源有效。必须确认资源文件可用,资源文件必须是支持的播放格式与协议;

  3. 对于网络播放,需要监听网络播放缓冲信息。

【解决方案】

  1. 确认当前AVPlayer的状态是否为idle状态。根据问题现象,当前音乐播放完成后需要调用reset()接口使AVPlayer进入idle状态后在设置新的媒体资源,代码如下:

    switch (state) {
      case 'completed':
        this.state = AudioPlayerState.COMPLETED;
        this.avPlayer.reset();
        this.playNextAuto();
        break;
    }
    async playNextAuto() {
      let avFileDescriptor: media.AVFileDescriptor = { fd: url.fd, offset: url.offset, length: url.length };
      this.avPlayer.fdSrc = avFileDescriptor;
      Logger.info(TAG, 'avPlayer.url:' + this.avPlayer.fdSrc);
    }
    
  2. 确认播放的媒体资源是有效的,分以下几种情况:

  3. 对于网络播放,需要监听网络播放缓冲信息,用于上报缓冲百分比以及缓存播放进度,代码如下:

    avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => {
      console.info('bufferingUpdate called,and infoType value is:' + infoType + ', value is :' + value)
    })
    

按上述思路排查,确认导致当前无法播放问题的原因是:音乐播放完成后,未调用reset()使播放器恢复idle状态就切换音频资源uri导致。播放器reset()切换uri播放恢复正常,问题解决。

【总结】

音乐播放完成后切换下一首播放,需要设置下一首音乐的媒体资源,要确认资源的有效性。媒体资源只允许在idle状态下设置,因此要将播放器恢复至idle状态。


更多关于HarmonyOS鸿蒙Next中如何解决AVPlayer做音乐播放器,切换音乐无法播放问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决AVPlayer做音乐播放器,切换音乐无法播放问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用AVPlayer做音乐播放器时,切换音乐无法播放的问题可能涉及以下几个方面:

  1. 资源释放问题:在切换音乐时,确保前一个AVPlayer实例的资源已正确释放。未释放的资源可能导致新音乐无法正常播放。可以通过调用release()方法来释放资源。

  2. 状态管理问题:在切换音乐时,确保AVPlayer的状态已正确重置。如果AVPlayer仍处于播放状态,直接切换可能导致问题。可以通过调用reset()方法来重置状态。

  3. URL或文件路径问题:确保新音乐的URL或文件路径正确无误。错误的路径或URL会导致无法加载音乐。可以通过日志或调试工具检查路径是否正确。

  4. 异步操作问题:在切换音乐时,确保所有操作都在主线程中执行。异步操作可能导致状态不一致,进而影响播放。可以通过runOnUiThread()方法确保操作在主线程中执行。

  5. 事件监听问题:确保正确监听AVPlayer的事件,如onPreparedonCompletion等。未正确处理这些事件可能导致播放逻辑错误。可以通过实现相应的监听器来处理这些事件。

  6. 权限问题:确保应用已获取必要的权限,如读取外部存储权限。缺少权限可能导致无法访问音乐文件。可以通过requestPermissions()方法请求权限。

  7. 缓存问题:在切换音乐时,确保缓存已正确清理。未清理的缓存可能导致新音乐无法加载。可以通过clearCache()方法清理缓存。

通过以上步骤,可以有效解决HarmonyOS鸿蒙Next中AVPlayer切换音乐无法播放的问题。

回到顶部