大家好,我是 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. .net core 用 identitymodel 请求token。

    identitymodel  也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...

  2. Elasticsearch(4)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)

    这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Document 1.Index index:索引是文档(Docume ...

  3. 从零开始构建一个gradle工程

    gradle init --type java-application 首先,确保您已经安装了Java和Gradle.您可以从官方网站下载并按照说明进行安装. 创建一个新的项目文件夹,并进入该文件夹. ...

  4. VulNyx - System

    扫描发现 2121是ftp端口 8000 http的一个端口 6379redis端口 爆破redis的密码 爆破出来时bonjour 猜测ftp的密码和redis的密码是一样的 尝试用密码去爆出ftp ...

  5. 使用twinkle-tray快捷调整多个显示器的亮度

    前言 自从安装了这个小工具,我再也没用过笔记本键盘上的快捷键了~ 介绍 Twinkle Tray enables brightness control on external displays in ...

  6. Nessus 扫描Web服务

    Nessus 扫描Web服务 1.点击 New Scan,选择 Web Application Tests 2.填写扫描名称和扫描目标 3.点击 Discovery ,选择 Scan Type 为全端 ...

  7. .NET最佳实践:避免滥用Task.Run

    在 C# 中,Task.Run 是用来在后台线程中执行异步任务的一个常见方法. 它非常适用于需要并行处理的场景,但如果不加以谨慎使用,可能会导致额外的线程池调度,进而影响程序的性能. 什么是线程池? ...

  8. Q: 远程ssh登录不上

    1.密码没有问题 .2.防火墙没有禁用端口.3.ssh服务已安装且开启一般是ssh配置文件问题打开ssh配置文件 vim /etc/ssh/sshd_config ################## ...

  9. Spark常用Sql

    一.日期处理 1.查询当前日期 SELECT current_date() 2023-12-22 2.查询当前时间戳 select current_timestamp() 2023-12-22 14: ...

  10. Spark异常总结

    1.Spark读写同一张表报错问题Cannot overwrite a path that is also being read from 问题描述:Spark SQL在执行ORC和Parquet格式 ...