开天辟地 HarmonyOS(鸿蒙) - 媒体: AVImageGenerator(提取视频指定时间点的图像)

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

开天辟地 HarmonyOS(鸿蒙) - 媒体: AVImageGenerator(提取视频指定时间点的图像)

示例如下:

pages\media\AVImageGeneratorDemo.ets

/*
 * AVImageGenerator - 提取视频指定时间点的图像
 */
import { TitleBar } from '../TitleBar'
import { media } from '@kit.MediaKit'
import { image } from '@kit.ImageKit'

@Entry
@Component
struct AVImageGeneratorDemo {

  build() {
    Column({ space: 10 }) {
      TitleBar()
      Tabs() {
        TabContent() { MySample1() }.tabBar('基础').align(Alignment.Top)
      }
      .scrollable(true)
      .barMode(BarMode.Scrollable)
      .layoutWeight(1)
    }
  }
}

@Component
struct MySample1 {

  @State message:string = ""
  @State pixelMap: image.PixelMap | undefined = undefined;

  build() {
    Column({space:10}) {

      /*
       * AVImageGenerator - 用于提取视频指定时间点的图像
       *   canIUse("SystemCapability.Multimedia.Media.AVImageGenerator") - 判断当前设备是否具有支持 AVImageGenerator 的能力
       *   media.createAVImageGenerator() - 创建 AVImageGenerator 对象
       *   fdSrc - 需要提取图像的视频文件的 AVFileDescriptor 对象
       *   fetchFrameByTime() - 提取视频指定时间点的图像(返回一个 PixelMap 对象)
       *     timeUs - 时间点(单位:微秒)
       *     options - 用于描述传入时间点与提取的图像的所属帧的关系(AVImageQueryOptions 枚举)
       *       AV_IMAGE_QUERY_NEXT_SYNC - 传入时间点或之后的关键帧
       *       AV_IMAGE_QUERY_PREVIOUS_SYNC - 传入时间点或之前的关键帧
       *       AV_IMAGE_QUERY_CLOSEST_SYNC - 传入时间点最近的关键帧
       *       AV_IMAGE_QUERY_CLOSEST - 传入时间点最近的帧(不一定是关键帧)
       *     param - 提取的图像的输出的宽和高
       *       width - 宽
       *       height - 高
       *   release() - 清理资源
       */
      Button('click me').onClick(async () => {
        let context = this.getUIContext().getHostContext()
        if (!context) {
          return;
        }

        if (canIUse("SystemCapability.Multimedia.Media.AVImageGenerator")) {
          let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
          let fileDescriptor: media.AVFileDescriptor = await context.resourceManager.getRawFd('video/mp4.mp4');
          avImageGenerator.fdSrc = fileDescriptor;

          let timeUs = 10_000_000;
          let options = media.AVImageQueryOptions.AV_IMAGE_QUERY_CLOSEST;
          let param: media.PixelMapParams = {
            width: 480,
            height: 200
          };

          try {
            this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, options, param);
          } catch (e) {
            this.message = `error: ${JSON.stringify(e)}`
          }

          avImageGenerator.release();
        }
      })

      Text(this.message)

      Image(this.pixelMap).width(480).height(200)
    }
  }
}

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

posted @ 2025-05-27 14:49  webabcd  阅读(11)  评论(0)    收藏  举报