# 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实现文件访问功能,获取源视频的沙箱路径,以及将沙箱中的文件复制到选择路径保存。
## 效果预览

## 约束与限制
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/)