HarmonyOS鸿蒙Next中使用avplay进行视频播放,进入页面时如何获取首帧的图片,并且同时会进行边缓存边播放视频,为网络视频

HarmonyOS鸿蒙Next中使用avplay进行视频播放,进入页面时如何获取首帧的图片,并且同时会进行边缓存边播放视频,为网络视频 无法获取首帧图片,并且播放时因为网络卡顿,需要缓存播放

3 回复

现阶段暂时没有获取网络视频缩略图的方法,只能将视频下载到本地,再获取缩略图。

关于网络卡顿,这个需要自己解决,正常是会对网络视频进行缓冲的。

bufferingUpdate:用于网络播放,监听网络播放缓冲信息,用于上报缓冲百分比以及缓存播放进度。

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/streaming-media-playback-development-guide-V13

网络视频因为数据不在本地,所以需要先下载一段数据到本地,然后用如下三方库,来获取第一帧图片,三方库如下:https://gitee.com/openharmony-tpc/mp4parser

下载一段数据可参考:

  1. 创建一个沙箱文件,并获取沙箱文件的readFd和writeFd

  2. 通过.new rcp.Request(DOWNLOAD_URL)创建网络下载请求request,配置request的TracingConfiguration,在onDataReceive回调中通过fs.writeSync传入沙箱文件的writeFd将下载的数据流写入本地沙箱文件,将fs.writeSync返回写入字节大小作为网络下载大小downloadSize,根据downloadSize和下载大小(默认1024*1024字节,AVPlayer默认缓存为1M)配置request的transferRange属性,控制网络下载的起始字节和结束字节

  3. 通过RCP的session.fetch传入request下载获取网络视频资源

  4. 配置AVPlayer的datasrc属性,在datasrc的回调函数中,通过fs.readSync传入沙箱文件的readFd将沙箱文件的数据写入内存buffer,沙箱文件大小为0时开启网络下载,当pos(表示填写的数据在资源文件中的位置)小于沙箱文件100kb时,再次开启网络下载进而实现分段下载,该回调函数在AVPlayer解析数据时触发,在边下边播的场景中,会不断触发该回调

  5. 设置AVPlayer播放资源。将datasrc设置给AVPlayer

参考

async saveHttpVideo(url: string, context: common.UIAbilityContext) {
  http.createHttp().request(url,
    {
      method: http.RequestMethod.GET,
      connectTimeout: 60000,
      readTimeout: 60000,
    },
    async (error: BusinessError, data: http.HttpResponse) => {
      if (error) {
        console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`);
      } else {
        if (http.ResponseCode.OK === data.responseCode) {
          let imageBuffer: ArrayBuffer = data.result as ArrayBuffer;
          try {
            let path = getContext().filesDir + '/demo.mp4'
            let file = await fileIo.open(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
            // 写入文件
            await fileIo.write(file.fd, imageBuffer);
            // 关闭文件
            await fileIo.close(file.fd);
          } catch (error) {
            console.error("error is " + JSON.stringify(error))
          }
        } else {
          console.error("error occurred when image downloaded!")
        }
      }
    })
}

更多关于HarmonyOS鸿蒙Next中使用avplay进行视频播放,进入页面时如何获取首帧的图片,并且同时会进行边缓存边播放视频,为网络视频的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用avplay进行视频播放时,获取首帧图片并实现边缓存边播放的功能可以通过以下步骤实现:

  1. 初始化avplay:使用AVPlayer类初始化视频播放器,设置视频源为网络URL。

  2. 获取首帧图片:通过AVPlayergetSnapshot方法获取视频的首帧图片。该方法可以在视频准备完成后调用,确保能够成功获取到首帧。

  3. 边缓存边播放:在设置视频源时,可以使用AVPlayersetCacheFilePath方法指定缓存路径,实现边缓存边播放的功能。这样在播放过程中,视频数据会被缓存到指定路径,后续播放时可以从缓存中读取,减少网络加载时间。

  4. 监听播放状态:通过AVPlayeron('stateChange')方法监听播放器的状态变化,确保在视频准备完成后进行首帧图片的获取和播放操作。

示例代码如下:

import { AVPlayer, AVPlayerState } from '@ohos.multimedia.avplayer';

let avPlayer = new AVPlayer();
avPlayer.url = 'https://example.com/video.mp4';
avPlayer.setCacheFilePath('/data/storage/el2/base/cache/video.mp4');

avPlayer.on('stateChange', (state: AVPlayerState) => {
    if (state === AVPlayerState.PREPARED) {
        avPlayer.getSnapshot((err, image) => {
            if (!err) {
                // 处理获取到的首帧图片
            }
        });
        avPlayer.play();
    }
});

avPlayer.prepare();

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现获取首帧图片并边缓存边播放网络视频的功能。

在HarmonyOS鸿蒙Next中,使用avplay进行视频播放时,可以通过以下步骤获取首帧图片并实现边缓存边播放:

  1. 初始化avplay:创建avplay实例并设置视频源。
  2. 获取首帧图片:使用avplaygetSnapshot方法在prepareAsync完成后获取首帧图片。
  3. 边缓存边播放:设置网络视频源时,avplay会自动处理缓存和播放。

示例代码:

AvPlayer player = new AvPlayer();
player.setDataSource("http://example.com/video.mp4");
player.prepareAsync();
player.setOnPreparedListener(() -> {
    player.getSnapshot((bitmap) -> {
        // 处理首帧图片
    });
    player.start();
});
回到顶部