# MediaSplitter **Repository Path**: scenario-samples/media-splitter ## Basic Information - **Project Name**: MediaSplitter - **Description**: 【鸿蒙 Harmony Next 示例 代码】本示例使用@sj/ffmpeg实现源视频的音视频分离功能,可以从源视频文件中获取视频和音频裸数据; - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-04-18 - **Last Updated**: 2025-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于FFmpeg的音视频分离 ## 介绍 本示例使用@sj/ffmpeg实现源视频的音视频分离功能,可以从源视频文件中获取视频和音频裸数据;
本示例使用@kit.MediaLibraryKit实现图库视频读取服务,获取图库视频的访问Uri;
本示例使用@kit.CoreFileKit实现文件保存到本地的功能,将分离后的视频流和音频流保存到选择目录;
本示例使用@ohos.file.fs实现文件访问功能,获取源视频的沙箱路径,以及将沙箱中的文件复制到选择路径保存。 ## 效果预览 ![基于FFmpeg的音视频分离](./Screenshots/基于FFmpeg的音视频分离.gif) ## 约束与限制 1.本示例支持 API Version 16 Release及以上版本。
2.本示例支持 HarmonyOS 5.0.4 Release SDK及以上版本。
3.本示例需要使用DevEco Studio 5.0.4 Release及以上版本进行编译运行。 ## 使用说明 ### 1.安装 ``` ohpm i @sj/ffmpeg ``` ### 2.在项目中引用 在需要依赖的模块找到 oh-package.json5 文件, 新增如下依赖, 执行同步后等待安装完成 ``` { "dependencies": { "@sj/ffmpeg": "^1.2.0" } } ``` ## 实现思路 使用FFmpeg分别执行音视频分离指令,将源视频文件的视频流与音频流分离。 ``` // 执行FFmpeg命令 private async executeFFmpeg(commands: string[]): Promise { hilog.info(0x0000, 'executeFFmpeg', `此时执行的指令: ${commands}`); return new Promise(async (resolve, reject) => { await FFmpeg.execute(commands, { logCallback: (logLevel: number, logMessage: string) => { hilog.error(0x0000, 'executeFFmpeg', `[${logLevel}]${logMessage}`); }, progressCallback: (message: string) => { hilog.error(0x0000, 'executeFFmpeg', `[progress]${message}`); } }).then(() => { hilog.error(0x0000, 'executeFFmpeg', `executeFFmpeg函数执行成功, 执行命令: ${commands}`); resolve(); }).catch((error: Error) => { hilog.error(0x0000, 'executeFFmpeg', `executeFFmpeg函数执行失败, 执行命令: ${commands}`); reject(error); }); }); } ``` ``` // 提取视频流 (H.264) await this.executeFFmpeg([ "ffmpeg", "-i", sourceVideoSandboxPath, "-c:v", "copy", // 视频流直接复制不重新编码 "-an", // 禁用音频 splitVideoOutputPath, "-y"// 覆盖输出文件 ]); ``` ``` // 提取音频流 (AAC) await this.executeFFmpeg([ "ffmpeg", "-i", sourceVideoSandboxPath, "-c:a", "copy", // 音频流直接复制不重新编码 "-vn", // 禁用视频 splitAudioOutputPath, "-y"// 覆盖输出文件 ]); ``` ## 工程目录 ``` entry/src/main/ets // 代码区 │ ├───entryability │ │ ├───EntryAbility.ets // 程序入口类 │ ├───pages │ │ └───MediaSplitterPage.ets // 音视频分离页面 ``` ## 模块依赖 [FFmpeg三方库依赖](https://ohpm.openharmony.cn/#/cn/detail/@sj%2Fffmpeg) ## 参考文档 [FFmpeg三方库](https://ohpm.openharmony.cn/#/cn/detail/@sj%2Fffmpeg) [选择图库视频文件](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-photoaccesshelper#photoaccesshelpergetphotoaccesshelper) [文件管理](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs#fscopyfilesync) [文件选择器](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-picker#documentviewpicker) ## ChangeLog | 修改内容 | 时间 | |-------|-------| | 初稿提交 | 2025/4/16 | ## 一份简单的问卷反馈 亲爱的Harmony Next开发者,您好!
为了协助您高效开发,提高鸿蒙场景化示例的质量,希望您在浏览或使用后抽空填写一份简单的问卷,我们将会收集您的宝贵意见进行优化:heart: [:arrow_right: **点击此处填写问卷** ](https://wj.qq.com/s2/19042938/95ab/)