HarmonyOS 鸿蒙Next 如何获取网络视频的第一帧图片?

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何获取网络视频的第一帧图片? 求解,如何获取网络视频的第一帧图片?

9 回复

网络视频因为数据不在本地,所以需要您先下载一段数据到本地,然后用如下三方库,来获取第一帧图片,三方库如下:
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

更多关于HarmonyOS 鸿蒙Next 如何获取网络视频的第一帧图片?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


实列参考吗?

这是示例内容。

不过我没用AVPlayer,下载文件以后用
avImageGenerator.fetchFrameByTime(frameTime, queryOption, param)
拿到第一帧图片了,

  • 接收到的前三帧数据,也可以通过业务需要调整。
  • let size: image.Size = {
    width: 640,
    height: 480
    }
    let receiver: image.ImageReceiver = image.createImageReceiver(size, image.ImageFormat.JPEG, 8);
    receiver.on('imageArrival', () => {
    console.info("imageArrival callback");
    receiver.readNextImage((err: BusinessError, nextImage: image.Image) => {
    if (err || nextImage === undefined) {
    console.error("receiveImage -error:" + err + " nextImage:" + nextImage);
    return;
    }
    nextImage.getComponent(image.ComponentType.JPEG, (err: BusinessError, imgComponent: image.Component) => {
    if (err || imgComponent === undefined) {
    console.error("receiveImage--getComponent -error:" + err + " imgComponent:" + imgComponent);
    return;
    }
    if (imgComponent.byteBuffer as ArrayBuffer) {
    let sourceOptions: image.SourceOptions = {
    sourceDensity: 120,
    sourcePixelFormat: 8,
    sourceSize: {
    height: 1080,
    width: 1920
    },
    }
    let imageResource = image.createImageSource(imgComponent.byteBuffer, sourceOptions);
    let imagePackerApi = image.createImagePacker();
    let packOpts: image.PackingOption = { format: "image/jpeg", quality: 90 };
    const filePath: string = getContext().cacheDir + "/image.jpg";
    let file = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
    imagePackerApi.packToFile(imageResource, file.fd, packOpts).then(() => {
    console.error('pack success: ' + filePath);
    }).catch((error: BusinessError) => {
    console.error('Failed to pack the image. And the error is: ' + error);
    })
    imageResource.createPixelMap({}).then((res) => {
    this.imgUrl = res;
    });
    } else {
    return;
    }
    nextImage.release();
    });
    });
    });
    

项目介绍

项目名称:测试项目

项目描述:这是一个测试项目,用于演示如何将HTML内容转换为Markdown格式。

开发者信息

  • 开发者姓名:张三
  • 联系电话:12345678901
  • 邮箱地址:zhangsan@example.com

在HarmonyOS(鸿蒙)系统中获取网络视频的第一帧图片,通常可以通过以下步骤实现,不涉及Java或C语言的具体代码实现细节,而是提供一个大致的方向:

  1. 视频流获取:首先,你需要通过相应的网络请求获取到视频流。这通常涉及到HTTP请求或流媒体协议(如RTSP)的使用。鸿蒙系统提供了丰富的网络请求API,可以用来获取视频数据。

  2. 视频解码:获取到视频流后,需要对视频进行解码以提取帧数据。鸿蒙系统可能提供了相应的多媒体处理框架或库,用于视频解码。你需要查找鸿蒙系统的文档,了解如何使用这些框架或库。

  3. 提取第一帧:在解码过程中,你可以截取第一帧图像数据。这通常涉及到对解码后的帧数据进行处理,提取出图像信息。

  4. 图像处理与保存:提取到第一帧后,你可能需要对图像进行进一步的处理(如格式转换、大小调整等),然后将其保存到本地或进行其他操作。

请注意,以上步骤是基于一般性的理解,并没有提供具体的代码实现。鸿蒙系统的具体API和实现方式可能会有所不同。你需要查阅鸿蒙系统的官方文档或开发者资源,以获取详细的实现方法和示例代码。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部