还在自己交叉编译 FFmpegFFmpeg-Kit 跨平台音视频处理实战指南【免费下载链接】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给 App 加一个转码功能光是把 FFmpeg 编出来就可能劝退你Android 的 NDK 和各 ABI、iOS 的 arm64/模拟器/Apple Silicon再逐个折腾 gnutls、x264 这些依赖的源码编译最后打包时还得面对 LGPL/GPL 的边界问题。FFmpeg-Kit 就是冲着这些痛点做的跨平台音视频处理工具包一套 FFmpeg 封装 API 加上 8 份预编译的二进制包覆盖 Android、iOS、Linux、macOS、tvOS、Flutter、React Native 七个平台让把 FFmpeg 塞进 App这件事从周级工程变成分钟级配置。五分钟上手在 Android 上跑通一次移动端视频转码Android FFmpeg 集成的路径最短gradle 里加一行依赖即可坐标形式是implementation com.arthenica:ffmpeg-kit-包名:6.0-2中间那段就是包名怎么选后面单独讲。加完依赖直接执行FFmpegSession session FFmpegKit.execute(-i file1.mp4 -c:v mpeg4 file2.mp4); if (ReturnCode.isSuccess(session.getReturnCode())) { // file2.mp4 已生成 } else { // 失败时先看 failStackTrace比反复盯着日志快 Log.d(FFmpegKit, String.format(rc%s, %s, session.getReturnCode(), session.getFailStackTrace())); }execute是同步调用会阻塞到 FFmpeg 进程退出并返回一个 session 对象返回码区分成功、取消、失败三种状态。其余平台的接入方式也是加依赖、调 API两步iOS / macOS / tvOSPodfile 里写pod ffmpeg-kit-ios-full, ~ 6.0macOS、tvOS 同理换平台段Objective-C API用法形态与 Java 完全一致Flutterpubspec.yaml 里声明ffmpeg_kit_flutter: 6.0.3装的就是默认包换其他包名用ffmpeg_kit_flutter_包名的形式注意包名里的连字符要换成下划线React Nativeyarn add ffmpeg-kit-react-native自带 TypeScript 定义Linux不发布预编译二进制需要在仓库根目录跑linux.sh自行构建对应 C API。想看封装层和构建脚本的源码可以 clone 仓库 https://gitcode.com/GitHub_Trending/ff/ffmpeg-kit 脚本集中在 scripts/ 和根目录的android.sh、ios.sh等入口里各平台细节在 docs/ 下有对应文档。八种预构建包怎么选如果你是……就选……先说清一个前提这 8 个包的区别只在于预编译时静态打包了哪些外部库。FFmpeg 自带的解码器已经能处理大量常见格式但编码 mp3 要 lame 或 shine、编码 H.264 要 x264、编 VP8/VP9 要 libvpx——这些都要靠外部库。所以选包本质上是回答一个问题你的产品到底要编什么。如果你是做最轻量的格式转换和转封装只用 FFmpeg 内置编解码器追求包体最小就选min。它不捆绑任何外部库也是所有包里唯一零外部依赖的。如果你要处理远程地址——直接从 https 下载流再转码——就需要 gmp 和 gnutls 这两个库选https。它还有个隐性地位Flutter 和 React Native 安装默认包时给的就是它所以不少项目默认就带着 https 能力。如果你的核心诉求是 H.264/H.265 编码注意这条线开始就是 GPL 阵营了min-gpl是 GPL 侧的最小组合x264、x265、xvidcore、vid.stab 四个库如果你同时要 https 又要 GPL 编码器有现成的组合包https-gpl不用自己拼。如果产品主线是音频——播客、语音消息、音频格式互转选audiolame、opus、speex、soxr、twolame、opencore-amr 这类 mp3/opus/AMR 编码器全家桶都在里面。如果主线是视频增强——字幕烧录、WebP、VP8/VP9、AV1 解码、高质量缩放选videolibass、libvpx、dav1d、zimg、freetype 这套组合是为此准备的。如果你说我不想每次发版都因为某个编码器不在包里而返工那就上full所有 LGPL 许可的外部库一次打包到位。最后full-gpl full 那四个 GPL 编码器功能最全代价也最大。在 Xcode 里把 full-gpl 的 iOS 包链接进来Link Binary With Libraries 面板里挂着的静态库一览无余从 libx264 到 libvpx、libwebp 都能看到GPL 与非 GPL 的分界线就是 x264、x265、xvidcore、vid.stab 这四个库在不在包里这对商业项目的意义不小放到合规一节细说。统一 API 背后做了什么session 与三个回调抛开各平台的语法差异它的工作模型其实就三层。最底层是把 FFmpeg/FFprobe 的命令行进程包进一个 session 对象。每次execute无论同步异步都对应一个新 session会话 ID、原始命令、参数列表、起止时间、运行状态、返回码、完整日志、统计序列、失败堆栈全部挂在这个对象上。执行完还能从FFmpegKitConfig.getSessions()或各平台的listSessions()取回历史会话列表——排查上次那次转码到底跑了什么参数时这个能力很省事。中间层是异步执行加三个回调complete会话结束、log每输出一行日志触发一次、statistics进度与速率。异步调用把命令丢进工作线程主线程完全不用等FFmpegKit.executeAsync(-i file1.mp4 -c:v mpeg4 file2.mp4, session - { // 完成回调会话执行完毕在这里读返回码、更新 UI }, log - { // 日志回调FFmpeg 每输出一行这里触发一次 }, statistics - { // 统计回调进度、比特率、帧率 });这三个回调在 Java、Objective-C、Dart、C、JavaScript 五套 API 里方法名和行为完全对齐这是它统一 API说法的实际含义——换平台迁移时业务代码基本只是换个语法。最外层是平台差异的消化。Android 侧它替你处理了 SAF Uri 到 FFmpeg 可读路径的转换getSafParameterForRead/getSafParameterForWrite支持摄像头采集和字体目录注册Apple 侧则直接把系统框架链进预编译产物里。iOS 的 framework 包依赖 VideoToolbox、Accelerate 这些系统库在 Xcode 的 Frameworks and Libraries 面板里是显式列出的也就是说硬件加速不是你要额外配置的选项而是预编译包里已经链好的一部分——前提是你选对了包的变体LTS 版本在这点上有取舍后面避坑一节会说。避坑指南移动端转码的线程、硬加速与日志监控这部分是踩坑踩出来的经验按要/不要的口吻列要把耗时操作全部走executeAsync。同步execute是阻塞调用挂在主线程上等于把 UI 线程一起扣住。要给移动端约束线程和成本转码任务加-threads 2限制线程数缩略图、预览这类场景用-preset ultrafast -crf 28这类参数把时间换空间直播、推流场景加-tune zerolatency。不要默认软件解码是唯一路径。Android 预编译产物默认启用了 MediaCodecApple 的 Main 版本链了 VideoToolbox、AudioToolbox、AVFoundation。注意两个坑iOS/tvOS 的 LTS 版本不含 VideoToolboxmain/LTS 的 API 级别下限也不同Android 24 对 16选型时要对清楚。要开全局日志与统计回调。用FFmpegKitConfig设一次所有会话的日志和进度都能被监控到失败时配合failStackTrace定位比本地反复复现快得多FFmpegKitConfig.enableLogCallback(log - { Log.d(FFmpegKit, log.getMessage()); }); FFmpegKitConfig.enableStatisticsCallback(statistics - { // 在这里刷新进度条处理时长、帧率、输出大小 });不要因为full-gpl 最全就直接上生产。包体积、GPL 义务见下节都要为此买单能用 min 或 audio 解决的事就别背全量依赖。要管理并发。多个 session 可以并行跑但要有手段收口FFmpegKit.cancel(sessionId)停单个会话FFmpegKit.cancel()全停配合 session 历史列表做任务管理。LGPL/GPL 许可证边界以及官方停更后往哪走先说许可。FFmpeg-Kit 封装库本身是 LGPL v3.0它的预编译 bundleAndroid 的 .aar、Apple 的 framework/xcframework默认也是 LGPL v3.0——构建脚本编译 FFmpeg 时固定带--enable-version3默认不启用任何非自由库。但有一条硬边界一旦使用带-gpl后缀的包或者自己加--enable-gpl构建bundle 里的 FFmpeg 就变成 GPL v3.0 许可整个 bundle 随之实际适用 GPL v3.0。闭源商业应用被裹进 GPL 义务是实打实的风险。专利层面项目文档自己也提醒了FFmpeg 以及 x264、x265、kvazaar 被认为包含可能受软件专利保护的算法openh264 则明确声明使用受专利保护的算法涉及 MPEG LA 授权费。如果你的业务覆盖软件算法可专利的地区分发含这些编码器的二进制前建议先咨询法务。给商业项目的实操建议就一句闭源产品走 min / https / audio / video / full 这条 LGPL 线-gpl 系列留给开源项目或愿意开源分发的场景。最后是维护状态直说。仓库 2026 年 7 月的更新公告写明FFmpegKit 已正式退役retired历史版本和文档仍留在仓库里原作者以 FFmpegKitNext 的名字继续开发但只提供源码分发不再出预编译包。各平台的包管理渠道Maven Central、pub.dev、npm上有社区维护的 fork 在延续分发。对应的操作建议存量项目用 6.0 系列二进制继续跑问题不大需要自编译时仓库里的scripts/和根目录构建脚本依然可用新项目则建议直接评估 FFmpegKitNext 的源码方案或挑一个活跃度可查证的社区 fork重点确认它跟的 FFmpeg 版本和许可证声明再决定迁移成本。这个项目留给我们最值钱的不是某份二进制而是它证明过的套路预编译包按功能切分、API 跨平台对齐、session 加回调的执行模型——这套设计在任何后继方案里都还成立。【免费下载链接】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),仅供参考