写点什么

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

作者:威哥爱编程
  • 2025-03-24
    北京
  • 本文字数:2107 字

    阅读完需:约 7 分钟

大家好,我是 V 哥。不得不佩服 HarmonyOS NEXT 原生能力的强大,如果你想在 鸿蒙 APP 开发中获取视频缩略图,不用依赖第三方库,就可以高效和稳定的实现,AVMetadataHelper 就是一个好帮手,下面 V 哥整理实现步骤的代码,帮助你快速理解,开整。


想要学习鸿蒙开发,一定绕不开学习 ArkTS 语言,V 哥写了三本鸿蒙开发之路的书,第一本《鸿蒙 HarmonyOS NEXT 开发之路 卷 1 ArkTS 篇》已上市,欢迎鸿蒙开发爱好者读一读,可以帮助你快速系统的拿下 ArkTS,每二本鸿蒙应用开发篇和项目实践篇也即将上市,清华大学出版社正在紧张校稿中。



总结步骤:


  1. 导入必要的模块,如 media 和 fileio。

  2. 申请存储权限。

  3. 获取视频文件的 URI 或路径。

  4. 使用 AVMetadataHelper 获取缩略图的 PixelMap。

  5. 将 PixelMap 转换为 ImageSource 并显示。

  6. 处理可能的错误和异常。


在 HarmonyOS NEXT 中,可以通过媒体服务提供的原生能力获取视频缩略图。以下是基于 ArkTS 的完整实现方案:


import avmetadata from '@ohos.multimedia.avmetadata';import fileIo from '@ohos.fileio';
@Entry@Componentstruct VideoThumbnailExample { @State thumbnail: PixelMap | null = null;
// 获取视频缩略图的核心方法 async getVideoThumbnail(videoPath: string) { try { // 1. 创建AVMetadataHelper实例 const avMetadataHelper = avmetadata.createAVMetadataHelper(); // 2. 设置视频源(支持URI和文件描述符两种方式) const fd = await fileIo.open(videoPath, 0o0); // 0o0表示只读模式 await avMetadataHelper.setSource(fd, avmetadata.AVMetadataSourceType.AV_METADATA_SOURCE_TYPE_FD); // 3. 获取缩略图(参数为时间戳微秒) const timeUs = 0; // 获取首帧缩略图 this.thumbnail = await avMetadataHelper.fetchVideoFrameByTime(timeUs, { width: 320, // 缩略图宽度 height: 240, // 缩略图高度 colorFormat: 4 // ImageFormat.ARGB_8888 }); // 4. 释放资源 avMetadataHelper.release(); fileIo.close(fd); } catch (err) { console.error('获取缩略图失败:', err.code, err.message); } }
build() { Column() { if (this.thumbnail) { // 显示缩略图 Image(this.thumbnail) .width(320) .height(240) .margin(10) } else { Text('正在加载缩略图...') } Button('选择视频') .onClick(async () => { // 这里需要实现视频文件选择逻辑 const demoVideoPath = 'xxx'; // 替换为实际视频路径 await this.getVideoThumbnail(demoVideoPath); }) } }}
复制代码


实现原理说明:


  1. 核心 API:@ohos.multimedia.avmetadata:提供音视频元数据操作能力• createAVMetadataHelper:创建元数据操作实例• fetchVideoFrameByTime:关键方法,按指定时间戳获取视频帧

  2. 参数配置:• 时间戳选择:timeUs参数支持微秒级精度(0 表示首帧)• 输出尺寸:建议保持视频原始宽高比• 颜色格式:推荐使用 ARGB_8888 格式(数值 4)

  3. 权限要求:module.json5中添加权限声明:


   "requestPermissions": [     {       "name": "ohos.permission.READ_MEDIA",       "reason": "需要读取视频文件"     }   ]
复制代码


  1. 性能优化:缓存机制: 对已生成的缩略图进行本地缓存• 异步操作: 所有 IO 操作都应在异步任务中执行• 资源释放: 必须及时调用 release()释放 Native 资源


扩展功能实现:


  1. 多帧缩略图获取:


async getMultiThumbnails(videoPath: string, intervals: number) {  const helper = avmetadata.createAVMetadataHelper();  const fd = await fileIo.open(videoPath, 0o0);  await helper.setSource(fd);    const duration = await helper.getDuration();  const step = duration / intervals;    const thumbnails = [];  for (let i = 0; i < intervals; i++) {    const frame = await helper.fetchVideoFrameByTime(i * step);    thumbnails.push(frame);  }    helper.release();  fileIo.close(fd);  return thumbnails;}
复制代码


  1. 自定义尺寸缩略图:


const options = {  width: 480,  height: 360,  colorFormat: 4,  frameStrategy: avmetadata.FrameStrategy.FRAME_STRATEGY_BEST_FIT // 自动适配最佳尺寸};
复制代码


注意事项:


  1. 支持的视频格式:MP4、3GP、MKV、AVI 等主流格式

  2. 错误处理建议:


try {  // 获取缩略图操作} catch (err) {  if (err.code === 5400101) {    console.error('文件格式不支持');  } else if (err.code === 5400103) {    console.error('指定时间超出视频时长');  }}
复制代码


  1. 性能指标参考:


  • 1080P 视频首帧获取时间:< 300ms

  • 单帧处理内存消耗:< 15MB


利用 HarmonyOS 的原生媒体处理能力,相比第三方库具有更好的性能表现和格式兼容性。实际开发也会结合LazyForEach实现视频列表的缩略图懒加载,同时配合缓存机制优化用户体验。关注威哥爱编程,鸿蒙开发一定行。

发布于: 刚刚阅读数: 7
用户头像

华为 HDE、CSDN 博客专家、Java畅销书作者 2018-05-30 加入

全栈领域优质创作者(Java/HarmonyOS/AI),公众号:威哥爱编程

评论

发布
暂无评论
HarmonyOS NEXT 基于原生能力获取视频缩略图_HarmonyOS_威哥爱编程_InfoQ写作社区