鸿蒙开发如何解码某一帧视频数据,将其保存成一个图片文件?


鸿蒙
2025-06-20 14:59:55
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
喝一大口可乐

【背景知识】

  1. AVImageGenerator
    AVImageGenerator主要用于获取视频缩略图。通过使用AVImageGenerator,开发者可以实现从原始媒体资源中获取视频指定时间的视频帧,支持的视频源可参考视频解码,开发指南可参考使用AVImageGenerator提取视频指定时间图像(ArkTS)

【解决方案】

  1. 使用AVImageGenerator获取视频缩略图

使用AVImageGenerator可以选取视频指定时间的帧作为缩略图,参考代码如下:

import media from '@ohos.multimedia.media';
import image from '@ohos.multimedia.image';
import { BusinessError } from '@ohos.base';
import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import photoAccessHelper from '@ohos.file.photoAccessHelper';

@Entry
@Component
struct Index {
  @State pixelMap: image.PixelMap | string | undefined = undefined; // pixelMap对象声明,用于图片显示

  build() {
    Column() {
      Button() {
        Text('select').fontSize(20).fontWeight(FontWeight.Bold)
      }.margin({ top: 20 }).width(100).height(40).onClick(() => this.showPicker())

      Image(this.pixelMap).width(300).height(300).margin({ top: 20 })
    }.width('100%').height('100%')
  }

  showPicker() { // 创建图库选择器对象实例
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker(); // 图库选项配置,类型与数量
    let selectOptions = new photoAccessHelper.PhotoSelectOptions();
    selectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE;
    selectOptions.maxSelectNumber = 1; // 调用select()接口拉起图库界面进行文件选择,文件选择成功后,返回PhotoSelectResult结果集
    photoViewPicker.select(selectOptions).then((photoSelectResult: picker.PhotoSelectResult) => { // 用一个全局变量存储返回的uri
      if (photoSelectResult.photoUris?.[0]) {
        this.testFetchFrameByTime(photoSelectResult.photoUris[0]);
      }
    }).catch((err: BusinessError) => {
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    })
  }

  async testFetchFrameByTime(filePath: string) { // 创建AVImageGenerator对象
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
    let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
    let avFileDescriptor: media.AVFileDescriptor = { fd: file.fd };
    avImageGenerator.fdSrc = avFileDescriptor; // 初始化入参
    let timeUs = 0;
    let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC;
    let param: media.PixelMapParams = {
      width: 300, height: 400,
    } // 获取缩略图(promise模式)
    this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param); // 释放资源(promise模式)
    avImageGenerator.release();
    console.info(`release success.`);
    fs.closeSync(file);
  }
}

【总结】

使用AVImageGenerator获取视频缩略图

分享
微博
QQ
微信
回复
2025-06-23 10:01:26
相关问题
arkTs如何获取视频一帧图片?
2354浏览 • 2回复 待解决
HarmonyOS 如何获取视频文件的第一帧
1038浏览 • 1回复 待解决
HarmonyOS如何获取视频一帧作为封面
2548浏览 • 1回复 待解决
ArkUI中如何获取mp4文件的第一帧图片?
7105浏览 • 1回复 待解决
HarmonyOS 监听Page第一帧上屏
998浏览 • 1回复 待解决
HarmonyOS gif图如何取第一帧
1021浏览 • 1回复 待解决
PixelMap怎么保存图片文件
1535浏览 • 1回复 待解决
Scroll中点击某一个图片移动到顶端
1680浏览 • 1回复 待解决
HarmonyOS 两object怎么拼接一个
1391浏览 • 1回复 待解决
鸿蒙 如何实现一个渐变的圆形图片
13761浏览 • 2回复 已解决