HarmonyOS 鸿蒙Next视频压缩解决方案

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next视频压缩解决方案

视频压缩解决方案

一、视频压缩库 VideoCompressor

概述

VideoCompressor 是一款适用于 OpenHarmony (ohos) 的高性能视频压缩器。目前支持以下功能:

  • 视频压缩
  • 设置输入源视频路径
  • 设置输出压缩视频路径
  • 设置压缩视频质量

引用方法

主要有两种方式集成 VideoCompressor 到项目中:

通过 DevEco Studio 集成

ohpm install @ohos/videocompressor

这将直接集成 VideoCompressor 到你的项目中。

通过 Git 命令集成

git clone https://gitee.com/openharmony-sig/ohos_videocompressor.git --recurse-submodules

下载完成后,将 third_party_bounds_checking_function 代码放入 videoCompressor/src/cpp/boundscheck 目录下,以确保编译通过。

使用方法

以下是一个使用 VideoCompressor 进行视频压缩的示例代码:

let videoCompressor = new VideoCompressor();

videoCompressor.compressVideo(getContext(), this.selectFilePath, CompressQuality.COMPRESS_QUALITY_HIGH)
    .then(data => {
        if (data.code == CompressorResponseCode.SUCCESS) {
            console.log("videoCompressor HIGH message:" + data.message + "--outputPath:" + data.outputPath);
        } else {
            console.log("videoCompressor HIGH code:" + data.code + "--error message:" + data.message);
        }
    })
    .catch(err => {
        console.log("videoCompressor HIGH get error message" + err.message);
    });

压缩质量选项

VideoCompressor 提供了三种压缩质量选项:

  • COMPRESS_QUALITY_HIGH:高质量压缩
  • COMPRESS_QUALITY_MEDIUM:中等质量压缩
  • COMPRESS_QUALITY_LOW:低质量压缩

优点

  • 支持任意格式的视频压缩(如 MP4 格式)。

缺点

  • 不支持设置压缩视频的比特率、帧率。
  • 不支持获取视频基础信息。
  • 不支持获取第一帧图片等功能。

二、使用 AVTranscoder 实现视频压缩转码

概述

AVTranscoder 是 OpenHarmony 提供的视频转码功能,从 API 12 开始,可在手机、平板、2in1 设备上作为系统提供的基础能力使用。可以通过调用 canIUse 接口判断当前设备是否支持 AVTranscoder

canIUse("SystemCapability.Multimedia.Media.AVTranscoder") // 返回 true 表示支持

开发步骤及注意事项

  1. 创建 AVTranscoder 实例

    import { media } from '@kit.MediaKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    let avTranscoder: media.AVTranscoder;
    media.createAVTranscoder().then(transcoder => {
        avTranscoder = transcoder;
        // 需要在 avTranscoder 完成赋值后,再进行其他操作
    }, error => {
        console.error(`createAVTranscoder failed`);
    });
  2. 设置监听事件

    import { BusinessError } from '@kit.BasicServicesKit';
    
    // 转码完成回调
    avTranscoder.on('complete', () => {
        console.log(`transcoder is completed`);
    });
    
    // 错误上报回调
    avTranscoder.on('error', (err: BusinessError) => {
        console.error(`avTranscoder failed, code is ${err.code}, message is ${err.message}`);
    });
  3. 设置源视频文件 fd

    import resourceManager from '@ohos.resourceManager';
    import { common } from '@kit.AbilityKit';
    
    let context = getContext(this) as common.UIAbilityContext;
    let fileDescriptor = await context.resourceManager.getRawFd('H264_AAC.mp4');
    this.avTranscoder.fdSrc = fileDescriptor; // 设置转码的源文件属性 fdSrc
  4. 设置目标视频文件 fd

    this.avTranscoder.fdDst = 55; // 设置转码的目标文件属性 fdDst
  5. 配置视频转码参数并调用 prepare() 接口

    import { media } from '@kit.MediaKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    let avConfig: media.AVTranscoderConfig = {
        audioBitrate: 100000, // 音频比特率
        audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式
        fileFormat: media.ContainerFormatType.CFT_MPEG_4, // 封装格式
        videoBitrate: 2000000, // 视频比特率
        videoCodec: media.CodecMimeType.VIDEO_AVC, // 视频编码格式
        videoFrameWidth: 640,  // 视频分辨率的宽
        videoFrameHeight: 480, // 视频分辨率的高
    };
    avTranscoder.prepare(avConfig).then(() => {
        console.log('Invoke prepare succeeded.');
    }, err => {
        console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);
    });
  6. 开始转码

    avTranscoder.start();
  7. 暂停转码

    avTranscoder.pause();
  8. 恢复转码

    avTranscoder.resume();
  9. 取消转码

    avTranscoder.cancel();
  10. 销毁实例

    avTranscoder.release();

优点

  • 支持设置音视频比特率、音视频编码格式、封装格式、视频分辨率宽高等参数。

缺点

  • 不支持获取第一帧图片等功能。
  • 部分视频在压缩转码后可能无法在 Mac 电脑上正常播放。

官方地址

AVTranscoder 官方文档

三、使用 FFMPEG 实现视频转码

概述

FFmpeg 是音视频专业处理工具,支持在项目中执行 ffmpegffprobe 相关的脚本命令,并支持并发操作。

引用方法

主要有两种方式集成 FFmpeg 到项目中:

通过 DevEco Studio 集成

ohpm i [@sj](/user/sj)/ffmpeg

通过 oh-package.json5 文件添加依赖

在需要依赖的模块中找到 oh-package.json5 文件,新增如下依赖:

{
  "dependencies": {
    "[@sj](/user/sj)/ffmpeg": "^1.1.2"
  }
}

执行同步后等待安装完成。

使用方法

执行 FFmpeg 命令

import { FFProgressMessageParser, FFmpeg } from '[@sj](/user/sj)/ffmpeg';

let commands = ["ffmpeg", "-i", inputPath, outputPath, "-y"];
FFmpeg.execute(commands, {
    logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
    progressCallback: (message: string) => console.log(`[progress]${JSON.stringify(FFProgressMessageParser.parse(message))}`),
}).then(() => {
    console.info("FFmpeg execution succeeded.");
}).catch(error => {
    console.error(`FFmpeg execution failed with error: ${error.message}`);
});

取消操作

import { FFProgressMessageParser, FFAbortController, FFmpeg } from '[@sj](/user/sj)/ffmpeg';

let abortController = new FFAbortController(); // 创建 abortController
setTimeout(() => abortController.abort(), 4000); // 模拟取消操作,延迟 4 秒后取消

let commands = ["ffmpeg", "-i", inputPath, outputPath, "-y"];
FFmpeg.execute(commands, {
    logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
    progressCallback: (message: string) => console.log(`[progress]${JSON.stringify(FFProgressMessageParser.parse(message))}`),
    signal: abortController.signal // 传入 abortController.signal
}).then(() => {
    console.info("FFmpeg execution succeeded.");
}).catch(error => {
    console.error(`FFmpeg execution failed with error: ${error.message}`);
});

执行 FFprobe 命令

import { FFmpeg } from '[@sj](/user/sj)/ffmpeg';

let commands = ["ffprobe", "-v", "info", "-of", "json", "-show_entries", "stream=sample_rate,bit_rate", "-i", inputPath];
let outputJson = "";
FFmpeg.execute(commands, {
    logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
    outputCallback: (message: string) => { outputJson += message; },
}).then(() => {
    console.info(`Execution succeeded with output: ${outputJson}`);
}).catch(error => {
    console.error(`Execution failed with error: ${error.message}`);
});

取消操作

import { FFAbortController, FFmpeg } from '[@sj](/user/sj)/ffmpeg';

let commands = ["ffprobe", "-v", "info", "-of", "json", "-show_entries", "stream=sample_rate,bit_rate", "-i", inputPath];
let abortController = new FFAbortController(); // 创建 abortController
setTimeout(() => abortController.abort(), 4000); // 模拟取消操作,延迟 4 秒后取消

let outputJson = "";
FFmpeg.execute(commands, {
    logCallback: (logLevel: number, logMessage: string) => console.log(`[${logLevel}]${logMessage}`),
    outputCallback: (message: string) => { outputJson += message; },
    signal: abortController.signal // 传入 abortController.signal
}).then(() => {
    console.info(`Execution succeeded with output: ${outputJson}`);
}).catch(error => {
    console.error(`Execution failed with error: ${error.message}`);
});

优点

  • 支持视频压缩、转码、设置帧率、比特率、分辨率宽高等操作。
  • 支持获取第一帧图片、视频信息等功能。

缺点

  • 暂时未发现明显缺点。

官方地址

FFmpeg 官方文档

通过以上三种方案,您可以根据需求选择适合的视频压缩解决方案。


更多关于HarmonyOS 鸿蒙Next视频压缩解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

HarmonyOS鸿蒙Next在视频压缩方面提供了多种解决方案。首先,鸿蒙Next支持硬件加速的视频编解码,能够利用设备上的GPU或其他专用硬件进行高效的视频压缩。其次,鸿蒙Next提供了MediaCodec API,开发者可以通过该API调用系统内置的视频编解码器,实现对视频的压缩处理。此外,鸿蒙Next还支持FFmpeg等开源库的集成,开发者可以灵活选择适合的编解码器进行视频压缩。鸿蒙Next的视频压缩解决方案还包括对H.264、H.265等主流视频编码格式的支持,确保压缩后的视频在质量和文件大小之间达到平衡。最后,鸿蒙Next还提供了视频编码参数的灵活配置,如比特率、帧率、分辨率等,开发者可以根据需求调整这些参数以实现最优的压缩效果。

在HarmonyOS(鸿蒙Next)中,视频压缩可以通过多种方式实现。首先,可以利用系统自带的媒体库API进行视频编码和压缩,选择适当的编码格式(如H.264或H.265)和分辨率来减少文件大小。其次,开发者可以使用第三方开源库如FFmpeg,通过集成其功能实现更灵活的视频压缩方案。此外,鸿蒙Next提供了多线程和硬件加速支持,能够显著提升视频处理的效率。最后,建议根据应用场景动态调整压缩参数,以在画质和文件大小之间找到最佳平衡。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!