HarmonyOS 鸿蒙Next视频压缩解决方案
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 表示支持
开发步骤及注意事项
-
创建 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`); });
-
设置监听事件
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}`); });
-
设置源视频文件 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
-
设置目标视频文件 fd
this.avTranscoder.fdDst = 55; // 设置转码的目标文件属性 fdDst
-
配置视频转码参数并调用 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}`); });
-
开始转码
avTranscoder.start();
-
暂停转码
avTranscoder.pause();
-
恢复转码
avTranscoder.resume();
-
取消转码
avTranscoder.cancel();
-
销毁实例
avTranscoder.release();
优点
- 支持设置音视频比特率、音视频编码格式、封装格式、视频分辨率宽高等参数。
缺点
- 不支持获取第一帧图片等功能。
- 部分视频在压缩转码后可能无法在 Mac 电脑上正常播放。
官方地址
三、使用 FFMPEG 实现视频转码
概述
FFmpeg
是音视频专业处理工具,支持在项目中执行 ffmpeg
及 ffprobe
相关的脚本命令,并支持并发操作。
引用方法
主要有两种方式集成 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}`);
});
优点
- 支持视频压缩、转码、设置帧率、比特率、分辨率宽高等操作。
- 支持获取第一帧图片、视频信息等功能。
缺点
- 暂时未发现明显缺点。
官方地址
通过以上三种方案,您可以根据需求选择适合的视频压缩解决方案。
更多关于HarmonyOS 鸿蒙Next视频压缩解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next视频压缩解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
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提供了多线程和硬件加速支持,能够显著提升视频处理的效率。最后,建议根据应用场景动态调整压缩参数,以在画质和文件大小之间找到最佳平衡。