FlutterFFmpeg 快速上手:10 分钟在移动端集成 FFmpeg,8 种包变体与 LTS 版本一次讲清
FlutterFFmpeg 快速上手:10 分钟在移动端集成 FFmpeg,8 种包变体与 LTS 版本一次讲清
【免费下载链接】flutter-ffmpegFFmpeg plugin for Flutter. Not maintained anymore. Superseded by FFmpegKit.项目地址: https://gitcode.com/gh_mirrors/fl/flutter-ffmpeg
FlutterFFmpeg(包名flutter_ffmpeg)是 Flutter 框架的 FFmpeg 插件,同时支持 iOS 与 Android,让你无需任何原生开发就能在 App 内直接调用 FFmpeg 和 FFprobe,完成视频转码、音频压缩、字幕烧录等移动端音视频处理。本文带你在 10 分钟内完成安装,并一次讲透 8 种包变体与 LTS 版本的选型差异。
一、FlutterFFmpeg 是什么:Flutter 生态里的移动端 FFmpeg 方案
插件基于 MobileFFmpeg 构建,内置了完整的 FFmpeg 与 FFprobe 能力,核心特性包括:
- 📱双端支持:Android(API 24+/LTS 16+)与 iOS(SDK 11.0+/LTS 9.3+)
- 🎬多版本内核:支持 FFmpeg v4.1 / v4.2 / v4.3 等多个版本
- 🏗多架构覆盖:Android 覆盖 arm64-v8a、arm-v7a 等,iOS 覆盖 arm64、armv7 等
- ⚡并发执行:可同时运行多个 FFmpeg 任务,互不阻塞
- 🔌25+ 外部库:内置 lame、opus、libvpx、x264 等常用编解码库
插件的核心 Dart 接口位于 lib/flutter_ffmpeg.dart,Android 与 iOS 的原生实现分别在android/src/main/java/com/arthenica/flutter/ffmpeg/FlutterFFmpegPlugin.java和ios/Classes/FlutterFFmpegPlugin.m,方便需要深入定制的同学阅读源码。
二、3 步安装:FlutterFFmpeg 集成到 Flutter 项目
第 1 步:添加依赖
在pubspec.yaml中加入依赖即可(默认安装基于 https 的包变体):
dependencies: flutter_ffmpeg: ^0.4.2第 2 步:配置 Android 包变体
编辑android/build.gradle,用ext.flutterFFmpegPackage指定你要的包:
ext { flutterFFmpegPackage = "https" }第 3 步:配置 iOS 包变体
在ios/Podfile的target 'Runner' do之前加入 README 中提供的flutter_install_plugin_pods方法,并在其中把 pod 写成flutter_ffmpeg/<包名>的形式,即可切换到任意变体。
💡 详细步骤与完整的 Podfile 代码片段见 README.md 的 "2.1 Packages" 章节。
三、8 种 flutter_ffmpeg 包变体怎么选
FFmpeg 的内置编码器有限,想编码 MP3、H.264、VP8/VP9 等格式,需要对应的外部库(如 lame、x264、libvpx)。FlutterFFmpeg 按"包含哪些库"把插件拆成了8 个包变体,按需选择既能满足功能,又能控制包体积:
| 包名 | 定位 | 关键外部库 |
|---|---|---|
min | 最小包,仅内置编码器 | 无 |
min-gpl | 最小包 + GPL 编码器 | vid.stab、x264、x265、xvidcore |
https | 默认包,支持网络流(RTMP/HLS 等) | gmp、gnutls |
https-gpl | https + GPL 编码器 | gmp、gnutls、x264 等 6 项 |
audio | 音频专精,转码 MP3/Opus 等 | lame、opus、libvorbis、speex 等 |
video | 视频专精,编码 WebM/WebP 等 | libvpx、libaom、libwebp、libass 等 |
full | 全能包(除 GPL 外全包含) | 25 项外部库 |
full-gpl | 完整版,含全部 GPL 库 | 29 项外部库 |
选型口诀:
- 只做视频缩放/格式转换 →
min - 要做 MP3、Opus 等音频转码 →
audio - 要编码 H.264/H.265 视频 → 选任意带
-gpl的包 - 处理网络直播流 →
https或https-gpl - 不确定用什么 → 直接
full,功能最全
四、Main Release 与 LTS 版本:一张表看懂差异
每个包名都有两个版本:Main Release(主力版)和LTS Release(长期支持版)。两者源码相同,只是构建参数不同。安装 LTS 只需把包名加上-lts后缀,例如https-lts、full-lts。
| 对比项 | Main Release | LTS Release |
|---|---|---|
| Android 最低 API Level | 24 | 16 |
| Android 摄像头访问 | ✅ | ❌ |
| Android 架构 | arm-v7a-neon、arm64-v8a、x86、x86-64 | 额外支持 arm-v7a |
| Xcode 最低版本 | 10.1 | 7.3.1 |
| iOS 最低 SDK | 11.0 | 9.3 |
| iOS AVFoundation | ✅ | ❌ |
| iOS 架构 | arm64、x86-64、Catalyst | armv7、arm64、i386、x86-64 |
结论:需要兼容老机型(Android 6 以下、iOS 9.x)选 LTS 包;追求新特性和摄像头能力选 Main 包。完整包名对照表见 README 的 "2.1.5 Package Names" 一节。
五、必须掌握的常用 API:执行、异步与日志监听
FlutterFFmpeg 的 Dart 接口非常简洁,日常开发 4 个方法就够用了:
final FlutterFFmpeg ffmpeg = new FlutterFFmpeg(); // 同步执行 FFmpeg 命令 ffmpeg.execute("-i file1.mp4 -c:v mpeg4 file2.mp4") .then((rc) => print("返回码: $rc")); // 异步执行(返回 executionId,可并发多任务) ffmpeg.executeAsync(ffmpegCommand, (execution) { print("任务 ${execution.executionId} 完成"); }); // 随时取消:cancelAll 或按 executionId 取消 ffmpeg.cancel();配套能力一览:
- 🔍FFprobe 探测:
FlutterFFprobe可执行探测命令,getMediaInformation()直接拿到时长、比特率、流信息等结构化数据 - 📝日志回调:
enableLogCallback把 FFmpeg 输出实时打到控制台或 UI - 📊进度统计:
enableStatisticsCallback获取实时码率、速度、帧数,轻松做进度条 - 🎚字体目录:
setFontDirectory()注册自定义字体,Android 上烧录字幕必需 - 🔗管道(Pipe):
registerNewFFmpegPipe()创建 FFmpeg 管道,实现边推流边处理
六、官方示例应用:边看边学
仓库自带一个功能完整的示例 App,位于example/目录,覆盖 8 大场景:命令行执行、视频编码、HTTPS 网络流、音频转码、字幕烧录、视频防抖、管道操作、并发执行,对应源码见example/lib/下的 video_tab.dart、pipe_tab.dart 等文件。
示例工程内置了几张高清测试图(吉萨金字塔、罗马斗兽场、泰姬陵),分别用于视频编码与 Pipe 管道的演示素材:
直接运行example项目,就能看到插件在真机上的完整效果,是学习 FFmpeg 命令最直观的途径。
七、5 个常见构建报错避坑清单
⚠️ 以下问题在官方 README "Tips" 章节有详细说明,提前看一遍能省很多时间:
- iOS 构建报 deployment target 错误—— 在
ios/Podfile中声明platform :ios, '11.0'(Main 包)或platform :ios, '9.3'(LTS 包) - Android 打包出现 UnsatisfiedLinkError—— 确保
build.gradle中mavenCentral()定义在jcenter()之前 - Xcode 打包后 PNG 解码失败—— 在 Build Settings 中将 "Compress PNG Files" 与 "Enable PNG slicing" 均设为 NO
- Android 烧录字幕无效果但不报错—— Android 没有默认 fontconfig 配置,需用
setFontDirectory注册字体 - 多个依赖重复打包 libc++_shared.so 冲突—— 在
build.gradle中按 README 添加pickFirst规则
八、许可证与项目现状
- 📜 FlutterFFmpeg 采用LGPL v3.0许可;若选用带
-gpl后缀的包变体,则受GPL v3.0约束(见 LICENSE 与 LICENSE.GPLv3) - 📢 项目当前处于停止维护状态,官方已建议新项目迁移到 FFmpegKit 方案,存量项目可继续使用
- 📋 版本更新记录见 CHANGELOG.md
小结:FlutterFFmpeg 让 Flutter 开发者以一行依赖 + 两行配置的成本,把工业级 FFmpeg 能力带进移动端。记住三件事即可:按需求选包变体(音频选audio、视频编码选-gpl包)、老设备用-lts后缀、iOS 记得声明部署目标。
【免费下载链接】flutter-ffmpegFFmpeg plugin for Flutter. Not maintained anymore. Superseded by FFmpegKit.项目地址: https://gitcode.com/gh_mirrors/fl/flutter-ffmpeg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
