HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据?

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

HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据? 怎么获取到视频的首帧画面和视频的宽度、高度? AVPlayer加载视频时怎样使其呈现首帧画面而不是一团漆黑?

5 回复

可以使用AVImageGenerator提取视频指定时间图像:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/avimagegenerator-V5

参考以下示例,设置文件描述符,获取一个视频指定时间的缩略图。

import { media } from '@kit.MediaKit';
import { image } from '@kit.ImageKit';

const TAG = 'MetadataDemo';
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  // pixelMap对象声明,用于图片显示
  @State pixelMap: image.PixelMap | undefined = undefined;

  build() {
    Row() {
      Column() {
        Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)
        Button() {
          Text('TestButton')
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
        }
        .type(ButtonType.Capsule)
        .margin({
          top: 20
        })
        .backgroundColor('#0D9FFB')
        .width('60%')
        .height('5%')
        .onClick(() => {
          // 设置fdSrc, 获取视频的缩略图
          this.testFetchFrameByTime();
        })
        Image(this.pixelMap).width(300).height(300)
          .margin({
            top: 20
          })
      }
      .width('100%')
    }
    .height('100%')
  }

  // 在以下demo中,使用资源管理接口获取打包在HAP内的视频文件,通过设置fdSrc属性,
  // 获取视频指定时间的缩略图,并通过Image控件显示在屏幕上。
  async testFetchFrameByTime() {
    // 创建AVImageGenerator对象
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
    // 设置fdSrc
    avImageGenerator.fdSrc = await getContext(this).resourceManager.getRawFd('demo.mp4');

    // 初始化入参
    let timeUs = 0;
    let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC;
    let param: media.PixelMapParams = {
      width : 300,
      height : 300
    };

    // 获取缩略图(promise模式)
    this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);

    // 释放资源(promise模式)
    avImageGenerator.release();
    console.info(TAG, `release success.`);
  }
}

更多关于HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个示例读取的是本地视频,如果是网络视频呢?

找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

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

这里有两个方法下载网络视频到本地:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-http-V13#requestinstream10

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-request-V13#requestdownloadfile9

在HarmonyOS鸿蒙系统中,当AVPlayer需要播放通过URL设置的在线视频时,获取视频元数据可以通过AVMetadataLoader类来实现。以下是一个简要的步骤说明:

  1. 创建AVPlayer实例:首先,你需要创建一个AVPlayer实例,并将要播放的在线视频URL设置给AVPlayer。

  2. 使用AVMetadataLoader:接着,创建一个AVMetadataLoader实例,并将AVPlayer作为其数据源。AVMetadataLoader负责从媒体流中提取元数据。

  3. 注册元数据回调:通过AVMetadataLoader的registerMetadataKeys方法注册你感兴趣的元数据键(例如,视频的标题、时长、宽度、高度等)。然后,设置元数据回调,当元数据加载完成时,该回调将被触发。

  4. 处理元数据:在元数据回调中,你可以获取并处理加载的元数据。

示例代码(伪代码形式,具体实现需根据鸿蒙API文档调整):

AVPlayer* player = new AVPlayer();
player->setSource(url);

AVMetadataLoader* loader = new AVMetadataLoader(player);
loader->registerMetadataKeys({/*感兴趣的元数据键列表*/});

loader->setMetadataLoadedCallback([](const AVMetadata* metadata) {
    // 处理元数据
});

// 开始加载元数据(通常AVPlayer开始播放时会自动加载)
player->prepare();

请注意,上述代码为概念性示例,具体实现需参考鸿蒙系统的AVPlayer和AVMetadataLoader的API文档。

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

回到顶部