HarmonyOS 视频缩略图问题?

我现在有一个视频url地址,如何获取该视频的每一秒(或者指定时间)的缩略图

阅读 520
1 个回答

参考demo

import { media } from '@kit.MediaKit';
import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
import { BusinessError, request } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
@Entry
@Component
struct Index {

  @State message: string = 'Hello World';
  // pixelMap对象声明,用于图片显示
  @State pixelMap: image.PixelMap | undefined = undefined;
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.downLoad()
        })
        .height('100%')
        .width('100%')
      Image(this.pixelMap).width(300).height(300)
        .margin({
          top: 20
        })
    }
  }

  downLoad(){
    try {
      request.downloadFile(context, {
        url: '',
        filePath: cacheDir + '/b.mp4'
      }).then((downloadTask: request.DownloadTask) => {
        downloadTask.on('complete', () => {
          console.info('download complete');
          this.testFetchFrameByTime(cacheDir + '/b.mp4')
        })
      }).catch((err: BusinessError) => {
        console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Invoke downloadFile 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);
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进