大家好,我是 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
@Component
struct 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实现视频列表的缩略图懒加载,同时配合缓存机制优化用户体验。关注威哥爱编程,鸿蒙开发一定行。

HarmonyOS NEXT 基于原生能力获取视频缩略图的更多相关文章

  1. android 获取视频缩略图终极解决方案(ffmpeg)

    http://blog.csdn.net/u010499721/article/details/50338623 前些天有个师弟(在做一个仿LinkInEyes行车记录仪的app)问我怎么获取视频缩略 ...

  2. java获取视频缩略图

    近期由于在做一个关于视频播放的项目,需要使用程序自动获取视频文件的缩略图,特写此文供其他人参考,有不清楚之楚可以给我留言. 1.使用工具:ffmpeg, 官网下载地址:http://ffmpeg.or ...

  3. 使用AVFoundation仅仅生成缩略图,不进行播放视频(本地和网络文件都可以创建视频缩略图)

    使用MPMoviePlayerController来生成缩略图足够简单,但是如果仅仅是是为了生成缩略图而不进行视频播放的话,此刻使用 MPMoviePlayerController就有点大材小用了.其 ...

  4. ios——MPMoviePlayerController截取视频缩略图 播放视频又可以截取视频缩略图

    #import <AVKit/AVKit.h>#import <MediaPlayer/MediaPlayer.h>#import "ViewController.h ...

  5. Windows下使用ffmpeg与java实现截取视频缩略图

    [ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压, ...

  6. Android之使用MediaMetadataRetriever类获取视频第一帧

    一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类.大家能够 ...

  7. Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器

    前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...

  8. android 中获取视频文件的缩略图(非原创)

    在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...

  9. Android必知必会-获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...

  10. C#:获取视频某一帧的缩略图

    读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图. 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形 ...

随机推荐

  1. 即时通讯技术文集(第30期):IM开发综合技术合集(Part3) [共16篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第30 期. ​[- 1 -] 全面掌握移动端主流图片格式的特点.性能.调优等 [链接] htt ...

  2. 今天记录一下管理系统中预览pdf的方法

    在管理系统中,有很多需要预览文件的操作,既方便用户查看又可以不用打开新的页面,我发现一个不错的方法,记录一下 <el-dialog title="" :visible.syn ...

  3. Activiti、Flowable和Camunda选型和对比

    https://camunda.com/https://www.jianshu.com/p/5942c4ee513chttps://zhuanlan.zhihu.com/p/484107368http ...

  4. biancheng-Spring Cloud Alibaba Nacos

    参考http://c.biancheng.net/springcloud/what-is-alibaba.html http://c.biancheng.net/springcloud/nacos.h ...

  5. biancheng-算法教程

    目录http://c.biancheng.net/algorithm/ 1算法是什么2时间复杂度和空间复杂度3递归算法4斐波那契数列5分治算法6找数组的最大值和最小值7汉诺塔问题8贪心算法9部分背包问 ...

  6. Spring Cloud认知学习(三):网关Zuul、config使用

    目录 zuul 作用: 简单示例: 0.创建模块 1.导入依赖: 2.主程序增加注解: 3.配置application.yml: 4.测试 配置语法: 路由 补充: 上一篇介绍一个新的组件Hystri ...

  7. 单用户模式启动 CentOS/RHEL 7/8 的三种方法

    单用户模式启动 CentOS/RHEL 7/8 的三种方法   单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题. 通常情况下,这类问题在多用户环境中修复不了.系统可以启动但功能 ...

  8. HBase多租户分组

    一.分组简介 RegionServer Group 通过对 RegionServer 进行分组,不同的 RegionServer 分到不同的组.每个组可以按需挂载不同的表,并且当组内的表发生异常后,R ...

  9. .Net Core 项目启动方式

    本文篇幅较小,讲解如何通过命令行启动项目 接着上一章的Core WebApi(https://www.cnblogs.com/zousc/p/12420998.html),我们已经有了Hello这个控 ...

  10. Maven入门,读完这篇就够了

    Maven 项⽬⽣命周期 Maven从项⽬的三个不同的⻆度,定义了三套⽣命周期,三套⽣命周期是相互独⽴的,它们之间不会相互影响. 清理⽣命周期(Clean Lifecycle):该⽣命周期负责清理项⽬ ...