# flutter_ffmpeg **Repository Path**: scenario-samples/flutter_ffmpeg ## Basic Information - **Project Name**: flutter_ffmpeg - **Description**: 【鸿蒙 Harmony Next 示例 代码】通过Flutter调用ffmpeg库进行文件格式转换,将录制的.mp4格式文件转换为.aac格式,满足业务需求。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-22 - **Last Updated**: 2025-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flutter项目调用ffmpeg库实现文件格式转换 ## 介绍 背景:米声应用在使用flutter_sound鸿蒙三方库时录制音频时发现编码格式暂时不支持aacADTS,无法录制.aac格式音频去做AI分析(接口仅支持使用.aac格式的音频去做AI分析) 解决思路:通过Flutter调用ffmpeg库进行文件格式转换,将录制的.mp4格式文件转换为.aac格式,满足业务需求。 ## 效果预览 ![image](./1.gif) ## 约束与限制 1. 本示例支持 API Version 12 Release及以上版本。 2. 本示例支持 HarmonyOS 5.0.0 Release SDK及以上版本。 3. 本示例需要使用DevEco Studio 5.0.0 Release及以上版本进行编译运行。 4. 本示例需要使用Flutter3.7.12及以上版本运行。 ## 使用说明 实现功能点: 1,打开手机.mp4文件并播放。 2,将.mp4文件转换为.aac音频文件。 3,保存.aac音频文件到手机目录。 4,打开手机.aac音频文件显示并播放。 5,将.aac音频文件从app页面列表删除。 扩展场景:其他使用ffmpeg命令对音视频处理转换也可参考此例子实现,扩展可包含:视频压缩,修改分辨率,修改文件大小等。 ## 实现思路 flutter通过channel的方式调用`FlutterFfmpegPlugin`插件方法,该方法实现了通过ffmpeg命令对将.mp4格式文件转成.aac音频格式的功能,核心代码如下: ``` onMethodCall(call: MethodCall, result: MethodResult): void { switch (call.method) { case 'executeFFmpegWithPath': { let sourcePath: string = call.argument("sourcePath"); let destPath: string = call.argument("destPath"); let output = destPath; let callBack: ICallBack = { callBackResult(code: number) { if (code === 0) { let re: HashMap = new HashMap(); re.set('rc', '0') re.set('msg', 'covert type success') re.set('data', output) result.success(re) } else { result.error('-1', 'cmd failed', 'ffmpeg cmd failed') } } } if(destPath.endsWith(".aac")){ MP4Parser.ffmpegCmd(` ffmpeg -y -i ${sourcePath} -vn -c:a aac -strict experimental -b:a 128k ${output}`, callBack); } break; } } } ``` 使用ffmpeg命令做格式转换,注意使用到了mp4parser三方库,该库封装了调用ffmpeg的命令执行过程,使得可以以接口的方式执行ffmpeg命令来调用原生库。 `ffmpeg -y -i ${source} -vn -c:a aac -strict experimental -b:a 128k ${output}`解析: ``` - `-y`: 这个选项表示在输出文件已经存在的情况下覆盖旧文件而不提示。 - `-i ${source}`: 指定输入文件的位置,`${source}` 是一个变量,代表了原始音视频文件的路径,此处从flutter侧通过参数传入,具体从手机目录选取对应的原始文件 - `-vn`: 表示不包含视频流,因为这里只处理音频。 - `-c:a aac`: 设置音频编解码器为AAC(高级音频编码),这是一种高效的音频压缩格式。 - `-strict experimental`: 这个选项告诉 `ffmpeg` 使用实验性的编码器。通常,AAC 编码器不需要这个选项,但有时为了启用某些特定功能或解决兼容性问题,可能会用到。 - `-b:a 128k`: 设置音频比特率为128kbps,这是常见的音频质量设置。 - `${output}`: 输出文件的位置,也是一个变量,代表了转换后音频文件的保存位置,此处从flutter侧通过参数传入,具体保存在手机目录 ``` ## 工程目录 ``` ├─example │ └─pubspec.yaml //方便管理和维护项目的依赖关系,引入插件依赖 │ ├─ lib │ │ └─main.dart // flutter项目入口 │ ├─ ohos │ │ ├─entry/src/main/ets │ │ │ ├─entryability │ │ │ │ └─EntryAbility.ets // 用于配置 Flutter 引擎并注册插件 │ │ │ ├─pages │ │ │ │ └─Index.ets // ArkUI应用中集成Flutter组件,实现跨平台的功能开 │ │ │ ├─plugins │ │ │ │ └─GeneratedPluginRegistrant.ets // 将`FlutterFFmpegPlugin` 的插件注册到 `flutterEngine` 中。 ├─lib │ └─flutter_ffmpeg.dart //插件UI入口 ├─ohos │ └─Index.ets │ ├─entry/src/main/ets │ │ ├─components/plugin │ │ │ └─FlutterFfmpegPlugin.ets // 插件入口 ,与arkts进行交互 └─pubspec.yaml ``` ## 模块依赖 ``` dependencies: flutter: sdk: flutter flutter_ffmpeg: path: ../../flutter_ffmpeg ``` ## 参考文档 开源仓:[https://github.com/tanersener/flutter-ffmpeg](https://github.com/tanersener/flutter-ffmpeg) 该开源仓目前仅适用于android和ios ## ChangeLog | 修改内容 | 时间 | |-------|------------| | 第一次提交 | 2025.02.05 | | 第二次提交 | 2025.04.17 | ## 一份简单的问卷反馈 亲爱的Harmony Next开发者,您好!
为了协助您高效开发,提高鸿蒙场景化示例的质量,希望您在浏览或使用后抽空填写一份简单的问卷,我们将会收集您的宝贵意见进行优化:heart: [:arrow_right: **点击此处填写问卷** ](https://wj.qq.com/s2/19042938/95ab/)