惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
B
Blog
博客园_首页
博客园 - 司徒正美
有赞技术团队
有赞技术团队
博客园 - 聂微东
I
InfoQ
美团技术团队
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

博客园 - webabcd

开天辟地 HarmonyOS(鸿蒙) - 工具: Targets, Products 开天辟地 HarmonyOS(鸿蒙) - 测试: 单元测试 开天辟地 HarmonyOS(鸿蒙) - 优化: HiDebug(用于获取 cpu, 内存等信息) 开天辟地 HarmonyOS(鸿蒙) - 优化: errorManager(捕获未处理异常) 开天辟地 HarmonyOS(鸿蒙) - 优化: HiAppEvent(事件日志) 开天辟地 HarmonyOS(鸿蒙) - 优化: hilog 日志 开天辟地 HarmonyOS(鸿蒙) - 安全: 用户认证 开天辟地 HarmonyOS(鸿蒙) - 安全: 申请权限 开天辟地 HarmonyOS(鸿蒙) - 安全: 关键资产 开天辟地 HarmonyOS(鸿蒙) - 安全: 加密解密 开天辟地 HarmonyOS(鸿蒙) - 信息: CommonEventManager(用于进程间通信,以及订阅系统事件) 开天辟地 HarmonyOS(鸿蒙) - 信息: emitter(用于同一进程内不同线程间或同一线程内发送和订阅事件) 开天辟地 HarmonyOS(鸿蒙) - 信息: 各种信息 开天辟地 HarmonyOS(鸿蒙) - 华为账号: 华为账号的默认登录 开天辟地 HarmonyOS(鸿蒙) - 元服务: 元服务 开天辟地 HarmonyOS(鸿蒙) - 媒体: AVMetadataExtractor(提取视频或音频的元数据信息) 开天辟地 HarmonyOS(鸿蒙) - 媒体: AVTranscoder(视频转码) 开天辟地 HarmonyOS(鸿蒙) - 媒体: SoundPool(音效播放器) 开天辟地 HarmonyOS(鸿蒙) - 媒体: AVPlayer(播放器,用于播放视频或音频)
开天辟地 HarmonyOS(鸿蒙) - 媒体: AVImageGenerator(提取视...
webabcd · 2025-05-27 · via 博客园 - webabcd

源码 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