使用AVImageGenerator可以实现从原始媒体资源中获取视频指定时间的缩略图,本开发指导将以获取一个视频资源的缩略图作为示例,向开发者讲解AVImageGenerator相关功能。
获取视频资源的缩略图的全流程包含:创建AVImageGenerator对象,设置资源,获取缩略图,销毁资源。
开发步骤及注意事项
详细的API说明请参考AVImageGenerator API参考。
使用createAVImageGenerator()创建实例。
设置资源:需要设置属性fdSrc(表示文件描述符)。
说明
开发者需根据实际情况,确认资源有效性并设置fdSrc:
可以使用ResourceManager.getRawFd打开HAP资源文件描述符,使用方法可参考ResourceManager API参考。
也可以使用应用沙箱路径访问对应资源(必须确认资源文件可用),参考获取应用文件路径。应用沙箱的介绍及如何向应用沙箱推送文件,请参考文件管理。
不同AVImageGenerator或者AVMetadataExtractor,如果需要操作同一资源,需要多次打开文件描述符,不要共用同一文件描述符。
获取指定时间图像:调用fetchFrameByTime(),可以获取到一个PixelMap对象,该对象可用于图片显示。
释放资源:调用release()销毁实例,释放资源。
完整方法:
async testFetchFrameByTime() {
// 创建AVImageGenerator对象
let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
let applicationContext = this.context.getApplicationContext();
// 获取应用文件路径
let filesDir = applicationContext.filesDir;
hilog.info(DOMAIN_NUMBER, TAG, `filePath: ${filesDir}`);
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fileIo.openSync(filesDir + '/test.MP4', fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 设置fdSrc
avImageGenerator.fdSrc = file.fd
// 初始化入参
let timeUs = 1;//指定秒数
let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC;
let param: media.PixelMapParams = {
width : 730,
height : 430,
};
// 获取缩略图(promise模式)
const pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);
avImageGenerator.release();
return pixelMap
}
返回值
- 返回值类型:
Promise<image.PixelMap>
返回一个PixelMap
对象,表示提取的视频帧的缩略图。
方法实现步骤
-
创建 AVImageGenerator 对象
调用media.createAVImageGenerator()
创建一个AVImageGenerator
实例,用于处理视频帧提取。 -
设置视频文件描述符 (fdSrc)
使用DownloadUtils.getSingle
获取单例对象,并调用其getVideoFd(id)
方法获取指定视频的文件描述符,将其赋值给avImageGenerator.fdSrc
。 -
初始化参数
timeUs
: 设置为1
,表示提取视频第 1 微秒的帧。queryOption
: 设置为media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC
,表示同步查询模式。param
: 定义提取帧的尺寸参数,宽度为730
,高度为430
。
-
提取视频帧
调用avImageGenerator.fetchFrameByTime(timeUs, queryOption, param)
提取指定时间点的视频帧,并返回一个PixelMap
对象。 -
释放资源
调用avImageGenerator.release()
释放AVImageGenerator
占用的资源。 -
返回结果
将提取的PixelMap
对象作为方法的返回值。
注意事项
- 提取的帧尺寸由
param
参数定义,可根据需求调整。 - 方法执行完成后会释放
AVImageGenerator
的资源,避免内存泄漏。
示例调用
const pixelMap = await this.testFetchFrameByTime(videoId);