#HarmonyOS NEXT体验官#视频播放器(缓存播放) 原创

小方头狮子
发布于 2024-8-6 08:49
浏览
0收藏

视频播放器(缓存播放)

本节我们使用无线调试

% ./hdc tconn 192.168.1.221:34617

接下来开始正文。

创建项目,想要运行项目,就要签名

#HarmonyOS NEXT体验官#视频播放器(缓存播放)-鸿蒙开发者社区

#HarmonyOS NEXT体验官#视频播放器(缓存播放)-鸿蒙开发者社区

签名以后我们就可以查看源码啦。

简介

本案例实现了视频边缓存边播放的功能。

效果预览:

#HarmonyOS NEXT体验官#视频播放器(缓存播放)-鸿蒙开发者社区

使用说明:

1.本案例需要访问一个网络视频直链来实现边缓存边播放的功能,您可以修改VideoPlayerManager.ets中的ORIGIN_URL为想要播放的视频直链。

2.安装应用后打开,应用会一边下载视频数据并保存在本地,一边读取本地缓存返回给播放器进行播放。

缓存播放实现

/**
 * Cache and play video.
 * @param context
 * @returns
 */
async cacheAndPlayVideo(context: common.UIAbilityContext): Promise<void> {
  hilog.info(0x0000, TAG, `cacheAndPlayVideo start`);

  class MyCacheListener implements CacheListener {
    onCacheAvailable(cacheFilePath: string, url: string, percentsAvailable: number): void {
      AppStorage.setOrCreate('currentCachePercent', percentsAvailable);
    }
  }

  GlobalProxyServer?.getInstance()?.getServer()?.registerCacheListener(new MyCacheListener(), ORIGIN_URL);
  let proxyUrl: string | undefined = await GlobalProxyServer?.getInstance()?.getServer()?.getProxyUrl(ORIGIN_URL);
  if (proxyUrl?.startsWith(context.cacheDir)) {
    const file = fs.openSync(proxyUrl, fs.OpenMode.READ_ONLY);
    proxyUrl = `fd://${file.fd}`;
  }
  hilog.info(0x0000, TAG, `proxyUrl ${proxyUrl}`);
  this.avPlayer.url = proxyUrl;
}

初始化

async initPlayer(context: common.UIAbilityContext, surfaceId: string,
  callback: (avPlayer: media.AVPlayer) => void): Promise<void> {
  hilog.info(0x0000, TAG, `initPlayer==initCamera surfaceId== ${surfaceId}`);
  this.surfaceID = surfaceId;
  try {
    this.avPlayer = await media.createAVPlayer();
    await this.setAVPlayerCallback(callback);
    this.cacheAndPlayVideo(context);
  } catch (err) {
    hilog.error(0x0000, TAG, `initPlayer initPlayer err:${JSON.stringify(err)}`);
  }
}

XComponent

可用于EGL/OpenGLES和媒体数据写入,并显示在XComponent组件。

XComponent({
  id: 'xcomponent',
  type: 'surface',
  controller: this.componentController
})
  .height(`${this.xComponentHeight}px`)
  .width(`${this.xComponentWidth}px`)
  .onLoad(() => {
    this.componentController.setXComponentSurfaceRect({
      surfaceWidth: Const.SURFACE_WIDTH,
      surfaceHeight: Const.SURFACE_HEIGHT
    });
    this.surfaceId = this.componentController.getXComponentSurfaceId();
    AvPlayManager.getInstance()
      .initPlayer(getContext(this) as common.UIAbilityContext, this.surfaceId, (avPlayer: media.AVPlayer) => {
        avPlayer.on('timeUpdate', (time: number) => {
          this.currentTime = time;
        });
        this.videoDuration = handleTime(avPlayer.duration);
        this.total = avPlayer.duration;
      })
  })

工程目录

├──entry/src/main/ets
│  ├──common
│  │  └──CommonConstants.ets            // 公共常量类
│  ├──entryability
│  │  └──EntryAbility.ets               // 程序入口类
│  ├──model
│  │  ├──GlobalProxyServer.ets          // 代理服务器
│  │  └──VideoPlayerManager.ets         // 播放器管理类
│  ├──pages                  
│  │  └──Index.ets                      // 首页
│  └──utils
│     └──utils.ets                      // 工具类
└──entry/src/main/resource              // 应用静态资源目录

相关权限

  • ohos.permission.INTERNET
  • ohos.permission.GET_NETWORK_INFO
"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  },
  {
    "name": "ohos.permission.GET_NETWORK_INFO"
  }
]

完毕

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐