《鸿蒙开发-答案之书》获取视频第一帧和视频时间

《鸿蒙开发-答案之书》获取视频第一帧和视频时间
typescript 复制代码
/**
     * 获取视频信息
     *```
     *let result = await MySightUtil.getSightInfo(this.sightUri);
     *let base64 : string = result[0];
     *let duration : number = result[1]
     *```
     * @param uri 视频地址
     * @returns 第一个数据是缩略图 base64 字符串,第二个是视频时长(单位秒)
     */
    public static async getSightInfo(uri: string): Promise<[string, number]> {
        let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
        let fdSrc: media.AVFileDescriptor = {
            fd: file.fd
        };

        // 视频第一帧
        let base64 = '';
        try {
            // 获取第一帧
            let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
            // 设置fdSrc

            avImageGenerator.fdSrc = fdSrc;
            // 初始化入参
            let timeUs = 0;
            let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC;
            let param: media.PixelMapParams = {};
            // 获取缩略图(promise模式)
            let pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);
            // 释放资源(promise模式)
            await avImageGenerator.release();
            const MAX_SIZE = 240;
            const MIN_SIZE = 100;
            await calculateThumbnailScaling(pixelMap, MAX_SIZE, MIN_SIZE);

            const imagePackerApi: image.ImagePacker = image.createImagePacker();
            let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 80 };
            let data: ArrayBuffer = await imagePackerApi.packing(pixelMap, packOpts);
            let buf: buffer.Buffer = buffer.from(data);
            base64 = buf.toString('base64', 0, buf.length);
        } catch (error) {
            let err = error as BusinessError;
            hilog.error(0x0000, '', `error code: ${err.code}, error message: ${err.message}`);
        }

        // 视频时长
        let duration: number = 0;
        try {
            // 获取视频时长
            let aVMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor();
            aVMetadataExtractor.fdSrc = fdSrc;
            let metadata = await aVMetadataExtractor.fetchMetadata();
            aVMetadataExtractor.release();
            // 毫秒
            duration = new Number(metadata.duration).valueOf();

            hilog.error(0x0000, 'IM-APP', `metadata: %{public}s`, JSON.stringify(metadata));
        } catch (error) {
            let err = error as BusinessError;
            hilog.error(0x0000, '', `error code: ${err.code}, error message: ${err.message}`);
        }

        return [base64, duration / 1000];
    }
相关推荐
梦想不只是梦与想11 分钟前
鸿蒙 预览数据模拟:Hamock
harmonyos·模拟数据·hamock
贾伟康3 小时前
【化学实验室|04】HarmonyOS ArkTS 场景选择器实战:让 13 个离线实验的入口、筛选和返回路径保持一致
harmonyos·arkts·canvas·arkui·化学实验
特立独行的猫a3 小时前
仓颉语言GUI开发实战:用仓颉写串口/网络二合一调试助手
网络·ui·gui·harmonyos·tauri·仓颉
hqzing13 小时前
把 glibc 移植到鸿蒙 PC 上:它能用来做什么
华为·harmonyos
OH_TPC19 小时前
HarmonyOS APP开发---“习惯猫“习惯打卡App,需要用到这个库
华为·harmonyos·鸿蒙
熊猫钓鱼>_>21 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
马剑威(威哥爱编程)1 天前
【共创稿事节】HarmonyOS 7 Agent 开发实战 09:Agent 测试评测集
华为·harmonyos
威哥爱编程1 天前
HarmonyOS 7 Agent 开发实战 04:云端 RAG 搭企业私有知识库问答
agent·harmonyos
威哥爱编程1 天前
HarmonyOS 7 Agent 开发实战 05:流式输出做打字机对话
agent·harmonyos
donk13141 天前
React Native for OpenHarmony 实战:三方库 react-native-circular-action-menu 的鸿蒙化适配指南
javascript·分布式·react native·react.js·wpf·harmonyos