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

《鸿蒙开发-答案之书》获取视频第一帧和视频时间
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];
    }
相关推荐
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day6ArkUI框架实战
flutter·开源·harmonyos
一只大侠的侠3 小时前
Flutter开源鸿蒙跨平台训练营 Day 4实现流畅的下拉刷新与上拉加载效果
flutter·开源·harmonyos
Android系统攻城狮3 小时前
鸿蒙系统Openharmony5.1.0系统之解决编译时:Node.js版本不匹配问题(二)
node.js·鸿蒙系统·openharmony·编译问题·5.1
早點睡3903 小时前
高级进阶 ReactNative for Harmony 项目鸿蒙化三方库集成实战:react-native-drag-sort
react native·react.js·harmonyos
果粒蹬i3 小时前
【HarmonyOS】DAY9:利用React Native开发底部 Tab 开发实战:从问题定位到最佳实践
华为·harmonyos
lbb 小魔仙4 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useForm 表单管理
harmonyos
早點睡3904 小时前
高级进阶 ReactNative for Harmony 项目鸿蒙化三方库集成实战:react-native-video
react native·华为·harmonyos
开开心心就好4 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
前端不太难5 小时前
HarmonyOS 游戏项目,从 Demo 到可上线要跨过哪些坑
游戏·状态模式·harmonyos
全栈探索者6 小时前
列表渲染不用 map,用 ForEach!—— React 开发者的鸿蒙入门指南(第 4 期)
react.js·harmonyos·arkts·foreach·列表渲染