HarmonyOS鸿蒙Next中media.createAVPlayer创建的播放器,初始化加载有点久,怎么优化

HarmonyOS鸿蒙Next中media.createAVPlayer创建的播放器,初始化加载有点久,怎么优化

XComponent({
  id: 'player',
  type: XComponentType.SURFACE,
  controller: this.xComponentController
})
  .width('100%')
  .height(this.XComponentHeight)
  .onLoad(async () => {
    this.surfaceID = this.xComponentController.getXComponentSurfaceId();
    this.initAVPlayer();
  })
async initAVPlayer() {
  media.createAVPlayer().then((video: media.AVPlayer) => {
    if (video === undefined) {
      return;
    }
    this.avPlayer = video;
    this.setAVPlayerCallback(this.avPlayer);
    if (typeof this.curSource === 'string') {
      this.avPlayer.url = this.curSource;
    } else {
      this.avPlayer.fdSrc = this.curSource;
    }
  }).catch((error: BusinessError) => {

  });
}

media.createAVPlayer创建的播放器,初始化加载有点久,进去播放,黑屏2~4s,除了给这个视频链接CDN加速,还有咩有什么设置可以加速一下吗


更多关于HarmonyOS鸿蒙Next中media.createAVPlayer创建的播放器,初始化加载有点久,怎么优化的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

开发者你好,可以参考下以下方式:

  1. 通过setMediaSource设置流媒体下载播放策略PlaybackStrategy。设置showFirstFrameOnPrepare为true显示视频起播首帧避免黑屏,设置preferredBufferDurationForPlaying调整起播缓冲水线来加速起播。
  2. 如果起播延迟不满足您的需要,可以考虑使用AVMetadataExtractorfetchFrameByTime预缓冲视频首帧的缩略图,在视频起播前,在XComponent覆盖首帧缩略图避免显示黑屏。

更多关于HarmonyOS鸿蒙Next中media.createAVPlayer创建的播放器,初始化加载有点久,怎么优化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


若视频源为mp4等单一文件,且文件太大,可以转换为m3u格式,使用流媒体播放方式。

没错,是mp4,但是这个格式我不能操作,因为别的平台app定了,我这边只能跟着兼容

网络播放,可以通过on(‘bufferingUpdate’)接口,订阅音视频缓存更新事件,在播放缓存事件回调方法中排查下缓存是否正常,也是要那么久,看看是不是网速问题

也可看下是不是视频码率太高了,刚开始播放也可降低一下视频码率,后面再修改回来

动态切码率是吗,有具体的操作方案吗,我看看怎么快速改一下

鸿蒙Next中media.createAVPlayer初始化加载慢,可优化以下方面:

  1. 预加载媒体资源,提前初始化播放器实例。
  2. 使用媒体预取功能,提前缓冲数据。
  3. 优化媒体文件格式与编码,采用更高效的编码参数。
  4. 检查并优化本地存储读取性能。
  5. 合理管理播放器生命周期,避免重复创建。

针对HarmonyOS Next中media.createAVPlayer初始化加载慢的问题,可以从以下几个方面进行优化,以减少黑屏时间:

  1. 预创建与复用播放器:在应用启动或进入播放场景前,提前创建AVPlayer实例并完成基础初始化(如设置通用回调)。当需要播放时,直接复用已初始化的播放器,仅更新数据源(urlfdSrc),避免每次播放都经历完整的创建和初始化过程。

  2. 异步准备与缓冲策略

    • 在设置urlfdSrc后,立即调用avPlayer.prepare(),让播放器提前开始解析媒体头和缓冲初始数据。
    • 监听stateChange事件,当状态变为prepared(状态码2)时,表示已准备好,可以立即调用avPlayer.play()开始播放,减少等待。
    • 对于网络流,可适当调整avPlayer.bufferSize(缓冲区大小),增大初始缓冲量以减少卡顿,但会略微增加初始延迟,需根据场景权衡。
  3. 使用Surface提前绑定:在您的代码中,XComponentonLoad回调里获取surfaceID并初始化播放器。可以确保在组件加载时即开始播放器设置,但需注意getXComponentSurfaceId()的调用时机。确保Surface已就绪,避免因Surface未准备好导致播放器初始化或视频帧渲染延迟。

  4. 优化媒体源与格式

    • 如果使用网络URL,确保服务器支持范围请求(Range Request),以便播放器能高效缓冲。
    • 使用更高效的编码格式(如H.264/AVC、H.265/HEVC)和封装格式(如MP4),避免使用解码复杂度高的编码。
    • 对于本地文件,使用fdSrc时确保文件描述符有效,且文件访问路径高效。
  5. 简化初始回调设置:在setAVPlayerCallback中,避免在播放器初始化阶段注册大量不必要的事件监听(如timeUpdate),仅在需要时注册关键事件(如stateChangeerror),减少初始化时的开销。

示例优化代码片段(聚焦预创建与异步准备):

// 提前创建并初始化播放器实例(例如在Page的aboutToAppear中)
private avPlayer: media.AVPlayer | null = null;

async aboutToAppear() {
  // 预创建播放器
  this.avPlayer = await media.createAVPlayer();
  this.setAVPlayerCallback(this.avPlayer); // 设置必要回调
}

// 在需要播放时,仅更新源并准备
async playVideo(source: string | media.AVFileDescriptor) {
  if (!this.avPlayer) return;
  
  if (typeof source === 'string') {
    this.avPlayer.url = source;
  } else {
    this.avPlayer.fdSrc = source;
  }
  
  // 异步准备,提前缓冲
  await this.avPlayer.prepare();
  // 监听stateChange,当状态为prepared时立即播放
  this.avPlayer.play();
}

通过以上方法,可以有效减少AVPlayer的初始加载延迟,提升播放启动速度。

回到顶部