HarmonyOS 鸿蒙Next中把两个视频按左右或上下位置拼接成一个视频
HarmonyOS 鸿蒙Next中把两个视频按左右或上下位置拼接成一个视频
把两个视频按左右或上下位置拼接成一个视频;这个是安卓的;请问鸿蒙能实现这个需求吗
更多关于HarmonyOS 鸿蒙Next中把两个视频按左右或上下位置拼接成一个视频的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【背景知识】
1. @ohos/mp4parser
[@ohos](/user/ohos)/mp4parser
是一个基于ffmpeg的用于处理 MP4 文件的三方库。它支持对 MP4 文件进行解析、编辑和生成等操作,可以方便地对视频文件进行各种处理,如拼接、裁剪等。
2. FFmpeg
FFmpeg
是一个开源的多媒体处理工具,支持多种音视频格式的转换、录制和流媒体传输。可以通过调用 FFmpeg 命令来实现视频的拼接、裁剪等操作。
【解决方案】
1. 实现思路
- 调整视频分辨率:如果两个视频的分辨率不同,需要先将它们调整为相同的分辨率。
- 拼接视频:使用 FFmpeg 命令将两个视频按左右或上下位置拼接成一个视频文件。
2. 具体示例——上下拼接
- 调整视频分辨率:
ffmpeg -i filePath_one -vf "scale=1280:720" filePath_one_new.mp4
ffmpeg -i filePath_two -vf "scale=1280:720" filePath_two_new.mp4
- 拼接视频:
ffmpeg -y -i filePath_one_new.mp4 -i filePath_two_new.mp4 -filter_complex vstack=inputs=2 outPath
- 代码实现:
参考[@ohos/mp4parser示例](https://developer.huawei.com/consumer/cn/doc/architecture-guides/merge_video-0000002297453758),增加以下功能:
- 在MP4Parser.ets 中添加垂直上下视频拼接功能代码:
static videoStackMergeVstack(filePath_one: string, filePath_two: string, outPath: string, callBack: ICallBack): void {
let fileCachePathCallBack: IFileCachePathCallBack = {
callBackResult(path: string) {
const ffmpegCmd = `ffmpeg -y -i ${filePath_one} -i ${filePath_two} -filter_complex vstack=inputs=2 ${outPath}`;
mp4parser_napi.exeFFmpegCmd(ffmpegCmd)
.then((res: number) => {
callBack.callBackResult(res);
})
.catch((err: Error) => {
console.error('FFmpeg 命令执行失败:', err.message);
callBack.callBackResult(-1);
});
}
};
fileCachePathCallBack.callBackResult('');
}
- 在VideoUtils.ets 文件中添加上下拼接过程代码:
async mergeVideoVstack(videoList: string[]): Promise<boolean> {
await this.formatVideo(videoList); // 格式化视频,将视频先转为.ts文件
let isSuccess = false;
let file: fs.File | undefined = undefined
try {
file = await fs.open(this.videoTxt, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
let videoNum = 0;
for (let uri of videoList) {
videoNum++;
let videoName = 'video' + videoNum.toString() + '.ts'; // 给视频文件命名和排序
let fileContent = 'file \'' + videoName + '\'\n';
await fs.write(file.fd, fileContent);
}
// Execute the FFmpeg batch merging command。
await new Promise<void>((resolve, reject) => {
MP4Parser.videoStackMergeVstack(
this.videoDir + '/video1.ts', // 第一个视频文件路径
this.videoDir + '/video2.ts', // 第二个视频文件路径
this.videoDir + '/' + this.outVideo, // 输出合并后的视频文件路径
{
callBackResult: (code: number) => {
if (code === 0) {
isSuccess = true;
resolve();
} else {
isSuccess = false;
reject(new Error(`视频合并命令执行失败,返回码: ${code}`));
}
},
}
);
});
return isSuccess; // 根据 isSuccess 的值返回合并是否成功
} catch (err) {
Logger.error('操作失败:', err.message);
return false;
} finally {
if (file) {
fs.close(file);
}
}
}
- UI 层配置:在点击视频导出按钮响应处,调用VideoUtils.mergeVideoVstack进行视频上下拼接,成功后调用CacheUtils.saveVideo()保存视频至图库:
...
VideoUtils.mergeVideoVstack(this.videoList).then((mergeResult: boolean) => {
this.isMerging = false
if (mergeResult) {
CacheUtils.saveVideo()
}
})
...
【约束与限制】
- 本示例支持 API Version 17 Release 及以上版本。
- 本示例支持 HarmonyOS 5.0.5 Release SDK 及以上版本。
- 本示例需要使用 DevEco Studio 5.0.5 Release 及以上版本进行编译运行。
【总结】
通过使用 [@ohos](/user/ohos)/mp4parser
和 FFmpeg,可以在鸿蒙系统中实现视频的拼接功能。
更多关于HarmonyOS 鸿蒙Next中把两个视频按左右或上下位置拼接成一个视频的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
楼主,你这个是视频裁剪功能的实现,目前需要采用第三方库(mp4parser)。目前文档中没有具体实现视频拼接的例子,不过有一个将视频添加画中画的例子。
参考:视频剪辑-添加画中画
需求开发
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
系统本身不行,除非在开发一个APP,
就是鸿蒙目前无法实现吗,
好像花瓣剪辑可以,
什么意思,
可以,
怎么实现;有参考文档吗,
在HarmonyOS Next中,可使用VideoComposer
组件实现视频拼接。通过VideoLayout
设置左右或上下布局模式,调用addVideoResource()
加载视频资源,并利用startCompose()
启动合成。输出格式支持MP4,编码参数可配置。
是的,HarmonyOS Next完全支持视频拼接功能。通过Media组件和AVRecorder/AVPlayer等多媒体API,可以轻松实现左右或上下布局的视频合并。
具体实现步骤:
- 使用AVMetadataExtractor获取两个视频的元数据(分辨率、时长等)
- 通过AVRecorder创建新的合成视频文件
- 使用Canvas或自定义渲染器将两个视频帧按指定布局(左右/上下)绘制到同一画面
- 配置编码参数并输出合成视频
关键API包括:
- AVRecorder:用于录制和合成
- Image/PixelMap:处理视频帧
- 图形渲染组件:控制画面布局
相比安卓方案,HarmonyOS的多媒体架构更统一,性能优化更好,特别是在跨设备协同处理时优势明显。