一、简介
OpenHarmony-5.0-Release 版本MediaKit 新提供了AVTranscoder JS API 用来实现视频转码功能,本文主要介绍了使用 AVTranscoder 实现视频转码功能的开发指导。
二、版本信息
OpenHarmony-5.0-Release 标准系统(2024/9/1),新增API持续演进中,后续可能存在差异。
三、开发流程
1、创建AVTranscoder实例
通过createAVTranscoder()构建一个AVTranscoder实例
import { media } from '@kit.MediaKit';
import { BusinessError } from '@kit.BasicServicesKit';
let avTranscoder: media.AVTranscoder;
media.createAVTranscoder().then((transcoder: media.AVTranscoder) => {
avTranscoder = transcoder;
}, (error: BusinessError) => {
console.error(`createAVTranscoder failed`);
})
2、设置监听事件
设置应用需要的监听事件,监听转码进度及错误上报
(1)progressUpdate 监听AVTranscoder的转码进度更新
(2)complete 监听AVTranscoder的转码完成
(3)error 监听AVTranscoder的错误信息
import { BusinessError } from '@kit.BasicServicesKit';
avTranscoder.on('progressUpdate', (progress: number) => {
console.log('avTranscoder progressUpdate = ' + progress);
});
// 转码完成回调函数
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、设置资源
设置fdSrc(源媒体文件描述,通过该属性设置数据源,即转码输入文件)和fdDst(目标媒体文件描述,通过该属性设置数据输出,即转码输出文件描述符)
注:fdSrc属性的类型为AVFileDescriptor;fdDst的属性的类型为number,需要调用基础文件操作接口(ohos.file.fs)实现应用文件访问能力,获取方式可参考应用文件访问与管理。
import resourceManager from '@ohos.resourceManager';
let context = getContext(this) as common.UIAbilityContext;
let fileDescriptor = await context.resourceManager.getRawFd('xxx.mp4');
// 设置转码的源文件属性fdSrc
this.avTranscoder.fdSrc = fileDescriptor;
// 设置转码的目标文件属性fdDst
this.avTranscoder.fdDst = xxx;
4、配置转码参数
prepare(config: AVTranscoderConfig): Promise<\void>
通过prepare接口进行视频转码的参数设置,目前支持设置的转码参数有限,只有一些基本的能力。
import { media } from '@kit.MediaKit';
import { BusinessError } from '@kit.BasicServicesKit';
let avConfig: media.AVTranscoderConfig = {
audioBitrate: 100000, // 输出音频的码率
audioCodec: media.CodecMimeType.AUDIO_AAC, // 输出音频的编码格式,目前只支持AAC_LC
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 输出的封装格式,目前支持MP4格式
videoBitrate: 2000000, // 输出视频的码率
videoCodec: media.CodecMimeType.VIDEO_AVC,
videoFrameWidth: 640, // 输出视频的宽
videoFrameHeight: 480, // 视频分辨率的高
}
avTranscoder.prepare(avConfig).then(() => {
console.log('Invoke prepare succeeded.');
}, (err: BusinessError) => {
console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);
})
5、开始转码
avTranscoder.start();
6、暂停转码
avTranscoder.pause();
5、恢复转码
avTranscoder.resume();
6、取消转码
avTranscoder.cancel();
7、取消转码事件监听
avTranscoder.off('progressUpdate');
avTranscoder.off('error');
avTranscoder.off('complete');
8、销毁实例
avTranscoder.release();
四、结语
后续持续更新转码的API参考、支持的能力及系统服务层的实现原理。