鸿蒙开发中获取指定视频的帧缩略图

使用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 对象,表示提取的视频帧的缩略图。

方法实现步骤

  1. 创建 AVImageGenerator 对象
    调用 media.createAVImageGenerator() 创建一个 AVImageGenerator 实例,用于处理视频帧提取。

  2. 设置视频文件描述符 (fdSrc)
    使用 DownloadUtils.getSingle 获取单例对象,并调用其 getVideoFd(id) 方法获取指定视频的文件描述符,将其赋值给 avImageGenerator.fdSrc

  3. 初始化参数

    • timeUs: 设置为 1,表示提取视频第 1 微秒的帧。
    • queryOption: 设置为 media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC,表示同步查询模式。
    • param: 定义提取帧的尺寸参数,宽度为 730,高度为 430
  4. 提取视频帧
    调用 avImageGenerator.fetchFrameByTime(timeUs, queryOption, param) 提取指定时间点的视频帧,并返回一个 PixelMap 对象。

  5. 释放资源
    调用 avImageGenerator.release() 释放 AVImageGenerator 占用的资源。

  6. 返回结果
    将提取的 PixelMap 对象作为方法的返回值。

注意事项

  • 提取的帧尺寸由 param 参数定义,可根据需求调整。
  • 方法执行完成后会释放 AVImageGenerator 的资源,避免内存泄漏。

示例调用

const pixelMap = await this.testFetchFrameByTime(videoId);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值