前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >HarmonyOS 开发实践——基于原生能力获取视频缩略图

HarmonyOS 开发实践——基于原生能力获取视频缩略图

原创
作者头像
小帅聊鸿蒙
发布2024-11-22 16:20:54
发布2024-11-22 16:20:54
1270
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

场景描述

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

方案描述

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

效果图

方案

1.通过photoAccessHelper的getAlbums方法获取获取视频相册对象。

2.通过视频检索条件调用album.getAssets方法,获取视频对象。

3.调用 Asset.getThumbnail接口获取视频对象的缩略图(pixelMap)。

4.通过image组件显示pixelMap。

核心代码

代码语言:ts
复制
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实例,释放资源。

核心代码

代码语言:ts
复制
//申明缩略图时间点与视频帧的对应关系。
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
  })

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂鸿蒙开发;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景描述
  • 方案描述
    • 场景一:自动生成相册中视频的缩略图
    • 场景二:指定时间获取视频的缩略图
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档