基于原生能力获取视频缩略图

HarmonyOS官方账号
发布于 2024-10-9 09:23
浏览
0收藏

​场景描述

使用 getThumbnail和AVImageGenerator接口可以实现从原始媒体资源中获取视频指定时间的缩略图。

方案描述

场景一:自动生成相册中视频的缩略图

效果图

基于原生能力获取视频缩略图-鸿蒙开发者社区

方案

  1. 通过photoAccessHelper的getAlbums方法获取获取视频相册对象。
  2. 通过视频检索条件调用album.getAssets方法,获取视频对象。
  3. 调用 Asset.getThumbnail接口获取视频对象的缩略图(pixelMap)。
  4. 通过image组件显示pixelMap。

核心代码

async getThumbnail() { 
  //建立视频检索条件,用于获取视频 
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 
  let fetchOptions: photoAccessHelper.FetchOptions = { 
    fetchColumns: [], 
    predicates: predicates 
  }; 
  //获取视频相册 
  let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.VIDEO); 
  let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject(); 
  console.info('get video album successfully, albumUri: ' + album.albumUri); 
  //获取视频相册的视频资源 
  let videoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await album.getAssets(fetchOptions); 
  //调用FetchResult.getFirstObject接口获取第一个视频。 
  let photoAsset: photoAccessHelper.PhotoAsset = await videoFetchResult.getFirstObject(); 
  console.info('video album getAssets successfully, photoAsset displayName: ' + photoAsset.displayName); 
  try { 
    console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName); 
    // let size: image.Size = { width: 350, height: 300 }; 
    //调用PhotoAsset.getThumbnail获取图片的缩略图的PixelMap 
    this.pixelMapp = await photoAsset.getThumbnail(); 
    let imageInfo: image.ImageInfo = await this.pixelMapp.getImageInfo() 
    console.info('getThumbnail successful, pixelMap ImageInfo size: ' + JSON.stringify(imageInfo.size)); 
    videoFetchResult.close(); 
    albumFetchResult.close(); 
  } catch (err) { 
    console.error('getThumbnail failed with err: ' + err); 
  } 
}

场景二:指定时间获取视频的缩略图

方案

1. 通过用createAVImageGenerator()创建AVImageGenerator对象。

2. 设置资源:需要设置AVImageGenerator对象的属性fdSrc(表示文件描述符)。

3. 获取指定时间点的缩略图:调用fetchFrameByTime(),传入具体时间,根据获取的缩略图时间点与视频帧的对应关系,可以获取到一个PixelMap对象,该对象可用于图片显示。

基于原生能力获取视频缩略图-鸿蒙开发者社区

取的缩略图时间点与视频帧的对应关系AVImageQueryOptions。

基于原生能力获取视频缩略图-鸿蒙开发者社区

4. 间隔一秒时间获取视频缩略图。

5. 释放资源:调用release()销毁avImageGenerator实例,释放资源。

核心代码

//申明缩略图时间点与视频帧的对应关系。 
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 
  })


分类
收藏
回复
举报
回复
    相关推荐