FFmpeg-Kit 跨平台音视频处理集成指南:7 大平台,5 分钟跑通第一次转码
【免费下载链接】ffmpeg-kitFFmpeg Kit for applications. Supports Android, Flutter, iOS, Linux, macOS, React Native and tvOS. Supersedes MobileFFmpeg, flutter_ffmpeg and react-native-ffmpeg.项目地址: https://gitcode.com/GitHub_Trending/ff/ffmpeg-kit
FFmpeg-Kit 是一个基于 FFmpeg v4.5+ 的跨平台音视频处理工具集,覆盖 Android、iOS、Linux、macOS、tvOS、Flutter 和 React Native 共 7 个平台。它替你完成 FFmpeg 的编译、依赖整合与平台适配,你只需引入预构建包,用一行代码执行 FFmpeg/FFprobe 命令。如果你刚接触跨平台音视频开发,这篇 FFmpeg-Kit 集成教程能帮你绕开自编译的全部坑。
🧩 直接集成 FFmpeg 有多难?
不用 FFmpeg-Kit,意味着你要为每个目标平台自行编译 FFmpeg 原生库:
| 维度 | 自行编译 FFmpeg | 使用 FFmpeg-Kit |
|---|---|---|
| 编译配置 | 手工组合 configure 选项,不同平台配置互不相同 | 官方构建脚本统一处理,scripts/ 下每个第三方库都有独立脚本 |
| 依赖管理 | x264、opus 等外部库要逐个找版本、逐个链接 | 预构建包已内置对应外部库,版本匹配已验证 |
| 平台适配 | Android 要处理 ABI 与 API 等级,Apple 要处理架构与 XCFramework | 各平台封装层已做适配,直接调用统一 API |
| 许可证 | 自己判断哪些组件触发 GPL | 包名后缀即许可证边界:带 -gpl 才是 GPL v3.0,其余均为 LGPL v3.0 |
任何一个环节出错都是漫长的调试过程,而这部分工作与你的业务逻辑无关。
📦 8 种预构建包怎么选?
把预构建包理解成八个"配好的工具箱":按需拿取,不必自己往箱子里装零件。FFmpeg-Kit 在每个平台的包管理器(Maven Central、CocoaPods、pub、npm)上提供 8 个包,差异只在于内置了哪些外部库:
| 包 | 内置外部库 | 谁适合选它 |
|---|---|---|
| min | 无(纯 FFmpeg 核心) | 只做基础转码、追求包体最小的应用 |
| min-gpl | x264、x265、xvidcore、vid.stab | 需要 H.264/H.265 编码,能接受 GPL 的应用 |
| https | gmp、gnutls | 要拉取 https 流媒体的场景 |
| https-gpl | gmp、gnutls、x264、x265、xvidcore、vid.stab | 既要 https 又要 GPL 编码器 |
| audio | lame、opus、speex、soxr、shine 等 10 种音频库 | 音频处理工具类应用 |
| video | dav1d、libvpx、libwebp、zimg、libass 等 12 种视频/字体库 | 视频处理、字幕烧录类应用 |
| full | 上述全部 LGPL 外部库 | 功能要求全、但不想引入 GPL 编码器的应用 |
| full-gpl | 全部外部库(含 x264、x265、xvidcore) | 需要完整能力且不关心许可证约束的应用 |
Android 包默认启用 MediaCodec,iOS/macOS/tvOS 包默认启用 AudioToolbox、AVFoundation 与 VideoToolbox,各包一致。
⏱️ 5 分钟跑通第一次转码
第一步:选包。假设你要把 MP4 转成 720p 的 H.264 视频,选 min-gpl(含 x264);若只做格式封装类操作,min 就够。
第二步:按平台引入。
- Android(Gradle):
implementation 'com.arthenica:ffmpeg-kit-min-gpl:6.0.3@aar' - Flutter(pubspec.yaml):
ffmpeg_kit_flutter_min_gpl: ^6.0.0 - React Native:
npm install ffmpeg-kit-react-native-min-gpl - 需要自行构建时,运行 android.sh、ios.sh、linux.sh、macos.sh、tvos.sh 并附加选项,如
./android.sh --enable-gpl
第三步:执行命令并检查返回码。以 Android 为例(各平台 API 一致):
FFmpegSession session = FFmpegKit.execute("-i input.mp4 -vf scale=1280:720 -c:v libx264 output.mp4"); if (session.getReturnCode().isSuccess()) { System.out.println("转码成功"); } else { System.out.println("转码失败:" + session.getFailStackTrace()); }execute返回一个FFmpegSession,所有结果(返回码、日志、统计、失败堆栈)都挂在它上面。
🌐 一套 API 覆盖 7 个平台
七个平台的封装库在功能与能力上完全一致,区别只在语言和平台集成点:
| 平台 | 语言 | 平台特性亮点 |
|---|---|---|
| Android | Java | 默认启用 MediaCodec 硬件编解码 |
| iOS / macOS / tvOS | Objective-C | 集成 AVFoundation、VideoToolbox(LTS 版本不含 VideoToolbox) |
| Linux | C++ | 面向服务器环境 |
| Flutter | Dart | 与原生行为一致,async/await 风格 |
| React Native | JavaScript(含 TypeScript 定义) | JS 与原生同构调用 |
🎬 两个高频场景实操
场景一:移动端视频压缩。把大体积 MOV 压成带 faststart 的 MP4,便于在线播放:
FFmpegSession s = FFmpegKit.execute( "-i input.mov -c:v libx264 -preset ultrafast -crf 28 " + "-c:a aac -b:a 128k -movflags +faststart output.mp4"); MediaInformation info = FFprobeKit.getMediaInformation("output.mp4").getMediaInformation(); System.out.println("时长: " + (info != null ? info.getDuration() : "?"));场景二:直播流转发。Linux 服务器上用 C++ API 做 RTMP 转推,视频流直接 copy、音频重封装为 AAC:
auto session = FFmpegKit::execute( "-re -i rtmp://input/live/stream " "-c:v copy -c:a aac -f flv rtmp://output/live/stream"); if (session->getReturnCode()->isSuccess()) { std::cout << "转推完成" << std::endl; }⚡ 性能调优与排查
转码是重操作,务必异步执行,把结果、日志、统计都交给回调处理。Android 上这样写:
FFmpegKit.executeAsync("-i in.mp4 -threads 2 -c:v libx264 -preset ultrafast -crf 28 out.mp4", s -> updateUI(s), // 完成回调 l -> Log.d("ffmpeg", l.getMessage()), // 日志回调 st -> Log.i("ffmpeg", "bitrate=" + st.getBitrate())); // 统计回调排查与调优三板斧:用日志回调实时定位报错原因;用统计回调监控比特率与帧率;在命令里用-threads限线程、-preset控速度、-crf控质量与体积的平衡。
最后三行许可证清单:
- 默认(min、https、audio、video、full):LGPL v3.0,适合多数商业应用
- 启用
--enable-gpl或使用 -gpl 后缀包:整体转为 GPL v3.0 - x264、x265、kvazaar 等可能涉及软件专利,分发前建议咨询法律意见
FFmpeg-Kit 适合需要在移动端、桌面端或跨平台框架里嵌入 FFmpeg 能力、又不想陷入自编译的初中级开发者。需要说明的是,该项目官方已停止维护,后续演进由原作者的 FFmpegKitNext 承担,但它的统一 API 设计、模块化预构建包和自动化构建脚本,至今仍是跨平台音视频工具设计的参考范本。
【免费下载链接】ffmpeg-kitFFmpeg Kit for applications. Supports Android, Flutter, iOS, Linux, macOS, React Native and tvOS. Supersedes MobileFFmpeg, flutter_ffmpeg and react-native-ffmpeg.项目地址: https://gitcode.com/GitHub_Trending/ff/ffmpeg-kit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考