FFmpeg Kit 退役迁移指南:30 分钟选对 4 个跨平台视频处理方案
【免费下载链接】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-full里捆绑的 FFmpeg 6.0 分支自 2023 年 9 月起再没收到过补丁,而线上视频转码服务天天在跑它。你翻出依赖树,发现ffmpeg_kit_flutter停在 6.0.3,React Native 侧的ffmpeg-kit-react-native停在 6.0.2——三个平台,同一个问题:这个包还有没有人管?
答案已经写在仓库首页里了。FFmpeg Kit 官方已正式退役:本仓库保留全部历史发布与文档,原项目不再发布新二进制。原作者把开发继续到了新名字 FFmpegKitNext 之下,只以源码方式分发;社区维护的分支则仍在各包管理器上架。对还在用 FFmpeg Kit 做移动端、桌面端多媒体处理的工程师来说,现在的核心问题不是"要不要迁移",而是从四条路里挑一条,并且知道每条路要付出什么。
3 年时间线:最后一个二进制停在 2023 年 9 月
先看事实。FFmpeg Kit 的版本号刻意跟随上游 FFmpeg 的大版本号,发布时间线如下:
几个值得记住的数字:
- 4.5.1(2022-01)是很多存量项目的版本,Flutter 的 CHANGELOG 显示它基于 FFmpeg 4.5-dev;
- 6.0.3(2023-09-19)是 Flutter 侧最后一个发布,只修了 bug,没有新功能;
- 6.0 起,Apple 平台主发布线要求 iOS 12.1+、macOS 10.15+,LTS 变体则下探到 iOS 10 / macOS 10.12,代价是没有 VideoToolbox 和 AVFoundation(见 LTS 对照表)。
也就是说,你手上 2023 年 9 月之后的任何"新版本"都不是官方产出的。
官方留下了什么:仓库里还剩 4 样有用的东西
退役不等于仓库作废。当前代码库里,下面这些内容对做迁移决策的人依然有用:
- 8 个包的组件矩阵。
min/https/audio/video/full以及各自的-gpl变体,每个包启用哪些外部库(x264、dav1d、opus、libvpx……)在 README 第 9 节 有完整对照。选替代包时,先拿这张表确认功能覆盖面,别盲目上full——体积差得不是一星半点。 - 自编译脚本。根目录的
android.sh、ios.sh、linux.sh、macos.sh、tvos.sh仍是可用的构建入口,scripts/下按平台拆好了每个外部库的编译脚本(scripts/android/、scripts/apple/、scripts/linux/)。走 FFmpegKitNext 源码路线时,这套基础设施可以直接复用思路。 - 跨平台一致的 API 设计。Android 是 Java、Apple 是 Objective-C、Flutter 是 Dart、Linux 是 C++、React Native 是 JavaScript + TypeScript 类型定义,五套绑定在功能上保持一致(
FFmpegKit.execute、ReturnCode、Session这套概念到处相同)。这解释了为什么迁移时业务代码基本不用动,动的只是依赖坐标。 - 各平台集成文档。android/README.md、apple/README.md、flutter/flutter/README.md、react-native/README.md 里的集成步骤(框架链接、签名、LTS 选项)对任何兼容分支都同样适用。
4 个替代方向:一张表把账算清
| 方向 | 迁移成本 | 活跃度 | 分发形态 | 适用人群 |
|---|---|---|---|---|
| A. 冻结在 6.0.x 不动 | 零 | 无更新 | 现成二进制(Maven Central / CocoaPods / pub / npm) | 无安全合规压力、短期不想动的存量项目 |
| B. FFmpegKitNext(原作者续作) | 中高:需自编译 | 持续跟进新 FFmpeg | 仅源码,无预编译包 | 有 CI 编译能力、想拿新 FFmpeg 特性、跟原作者生态走的团队 |
| C. 社区维护分支 | 低:只改依赖坐标 | 各分支不等,上架各包管理器 | 预编译包(README 首页列出了各平台的包管理器检索入口) | 想最小改动恢复更新渠道的项目 |
| D. 弃用套件,直接用 FFmpeg | 高:自己管 7 个平台的编译、链接、分发 | 跟随 FFmpeg 上游 | 上游源码 | 只需要单一平台、或已有完整 NDK/Xcode 构建链的基建团队 |
怎么选,我的建议是:先判断"是否必须跟进新 FFmpeg"。如果只是安全扫描催你,A + 锁定版本 + 关注 B/C 动态,是当前性价比最高的组合;如果要上 AV1 硬解、新版 x265 这类特性,C(有预编译包)优先于 B(自己编译);只有一个平台且基建强,D 才是干净方案。
分平台动手:每个平台要改的其实只有 3 行
无论选 C 还是 B,改动的落点都一样:依赖坐标 + 包管理器来源 + 一次回归验证。以"换到社区分支"为例,改前改后对照如下。
Android(build.gradle):
repositories { mavenCentral() // 改前:官方坐标,最后一次发布于 2023 年 // 改后:在包管理器检索页找到社区分支后,换成其 group/artifact } dependencies { // 改前 implementation 'com.arthenica:ffmpeg-kit-full:6.0-2' // 改后:坐标以目标社区分支的发布页为准,包名(min/video/full)语义保持 }Apple(Podfile):
# 改前:官方 spec pod 'ffmpeg-kit-ios-full', '6.0' # 改后:指向社区分支的 spec 源或本地 vendored 版本Apple 侧额外注意:主发布线与 LTS 变体的最低系统版本、VideoToolbox 支持不同(iOS 主发布 12.1+,LTS 10+),换分支时先确认目标包的 Min SDK 没有抬到你的用户群之外。集成方式仍是静态链接框架,系统框架依赖清单如上一节截图所示,签名配置沿用现有流程。
Flutter(pubspec.yaml):
# 改前:最终版本 6.0.3 ffmpeg_kit_flutter: 6.0.3 # 改后:换成 pub 上对应的社区包,版本写死 # LTS 用户注意:旧版用 6.0.3-LTS 后缀区分变体,确认新包是否保留该约定React Native(package.json):
{ "dependencies": { "ffmpeg-kit-react-native": "6.0.2" } }把上面的坐标换成目标社区分支在 npm 上的发布名并锁定版本即可;TypeScript 类型随包分发(见 react-native/src/index.d.ts),import { FFmpegKit } from '...'的业务代码一般不需要改。
如果选了 B(FFmpegKitNext 源码路线),改动就不是 3 行而是建一条编译流水线:参考本仓库的 android/README.md 准备 NDK r22b+ 与构建依赖(autoconf、nasm、meson 等),用仓库根目录的平台脚本作为参考基线,把构建产物上传到私有制品库,再让上面 4 个平台的依赖指向私有源。工作量集中在 CI,不在业务代码。
3 个迁移前必查的坑
- 许可证跟着
-gpl后缀走。官方包默认 LGPL v3.0;一旦使用带-gpl后缀的二进制,整个 bundle 变为 GPL v3.0(原因见 README 第 14 节)。社区分支不一定沿用同样的包命名,换包时逐包核对许可证声明,尤其商业闭源分发的项目。 - 别默认上
full。min、audio、video、full之间,外部库数量从 0 到 30 个不等(dav1d、x264、libass、tesseract 依赖的 leptonica 都在 heavy 区)。按当前用到的编码器倒查 README 的组件矩阵,只挑需要的包,APK / IPA 体积能省出几十 MB。 - LTS 变体是隐藏的功能差集。LTS 版本为了兼容老设备,砍掉了 Camera 访问、VideoToolbox、AVFoundation、arm64-simulator 等能力(对照表)。如果你的 App 依赖 iOS 相机直采或 VideoToolbox 硬编,换 LTS 分支会静默丢失功能,回归用例里必须覆盖。
行动清单:今天就能做的 5 件事
- 清点版本:在
gradle dependencies、pod outdated、flutter pub deps、npm ls里确认三个平台上 FFmpeg Kit 的实际版本,标出是否低于 6.0.3。 - 写死版本号:所有依赖从
~>/^改成精确版本,冻结当前状态,避免供应链里出现未知更新。 - 对一遍功能矩阵:拿 README 第 9 节的 8 包组件表,列出当前项目实际用到的编码器/协议,确认现有包的覆盖。
- 给 A 路线买保险:把"跟进 FFmpegKitNext 或社区分支"排进下个季度技术债清单,并订阅对应包管理器的版本更新;迁移窗口选在功能冻结期。
- 准备好验证脚本:用仓库内跨平台一致的
FFmpegKit.execute+ReturnCode模式,写一条最小转码链路(输入 → 转码 → 探测输出),换包后跑通它,再谈上线。
FFmpeg Kit 的 API 设计让这次迁移的业务代码改动趋近于零,真正的决策成本在"选哪条路"上。想清楚安全合规的底线和要的新特性,其余的都是执行细节。
相关入口:Android 集成文档 · Apple 集成文档 · Flutter 集成文档 · React Native 集成文档 · 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),仅供参考