在HarmonyOS NEXT开发中从相册获取的视频地址,如何获取视频略缩图?

在HarmonyOS NEXT开发中从相册获取的视频地址,如何获取视频略缩图?

阅读 589
1 个回答

参考代码:

//申明缩略图时间点与视频帧的对应关系。 
let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_CLOSEST_SYNC 
//缩略图的格式参数。 
let param: media.PixelMapParams = { 
  width: 300, 
  height: 300, 
} 
async aboutToAppear(): Promise<void> { 
  // 创建AVImageGenerator对象 
  avImageGenerator = await media.createAVImageGenerator() 
  // 设置fdSrc 
  avImageGenerator.fdSrc = await getContext(this).resourceManager.getRawFd('VID_1713928724_004.mp4'); 
} 
async testFetchFrameByTime(i: number) { 
 
  // 获取缩略图(promise模式) 
  this.pixelMap = await avImageGenerator.fetchFrameByTime(i, queryOption, param) 
 
} 
//间隔1秒获取视频缩略图 
onClick(() => { 
 
  i = i + 1000000; 
  Logger.info("current i is :" + i); 
 
  this.testFetchFrameByTime(i) 
}) 
Image(this.pixelMap).width(300).height('30%')// .syncLoad(true) 
  .margin({ 
    top: 20 
  }) 
//核心思路 
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); 
} 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进