Mobile-FFmpeg 跨平台多媒体处理框架详解
2025-07-09 03:25:14作者:羿妍玫Ivan
框架概述
Mobile-FFmpeg 是一个专为移动平台设计的 FFmpeg 封装库,支持 Android、iOS 和 tvOS 平台。它将强大的 FFmpeg 多媒体处理能力带到了移动端,让开发者能够在移动应用中实现各种音视频处理功能。
核心特性
多平台支持
- Android:支持 API Level 16+,构建 arm-v7a、arm-v7a-neon、arm64-v8a、x86 和 x86_64 架构
- iOS:支持 iOS SDK 9.3+,构建 armv7、armv7s、arm64、arm64e、i386、x86_64 和 Mac Catalyst 架构
- tvOS:支持 tvOS SDK 9.2+,构建 arm64 和 x86_64 架构
功能组件
- 包含 FFmpeg 和 FFprobe 两个核心工具
- 支持 FFmpeg v3.4.x 到 v4.4-dev 多个版本
- 提供 29 个外部库支持,包括 5 个 GPL 授权库
- 支持并发执行
系统集成
- Android:支持 zlib 和 MediaCodec 系统库
- iOS/tvOS:支持 bzip2、iconv、libuuid、zlib 系统库
- iOS:额外支持 AudioToolbox、VideoToolbox、AVFoundation 框架
安装与配置
Android 集成
- 添加仓库依赖到 build.gradle:
repositories {
mavenCentral() // 4.4及以后版本
// jcenter() // 4.3.2及以前版本
}
- 添加 MobileFFmpeg 依赖:
dependencies {
implementation 'com.arthenica:mobile-ffmpeg-full:4.4'
}
iOS/tvOS 集成
在 Podfile 中添加:
# iOS
pod 'mobile-ffmpeg-full', '~> 4.4'
# tvOS
pod 'mobile-ffmpeg-tvos-full', '~> 4.4'
核心功能使用指南
基本命令执行
同步执行
// Android
int rc = FFmpeg.execute("-i input.mp4 -c:v libx264 output.mp4");
if (rc == RETURN_CODE_SUCCESS) {
// 处理成功
}
// iOS
int rc = [MobileFFmpeg execute: @"-i input.mp4 -c:v libx264 output.mp4"];
if (rc == RETURN_CODE_SUCCESS) {
// 处理成功
}
异步执行
// Android
long executionId = FFmpeg.executeAsync(command, new ExecuteCallback() {
@Override
public void apply(long executionId, int returnCode) {
// 回调处理
}
});
// iOS
long executionId = [MobileFFmpeg executeAsync:command withCallback:self];
// 实现回调方法
- (void)executeCallback:(long)executionId :(int)returnCode {
// 回调处理
}
媒体信息获取
// Android
MediaInformation info = FFprobe.getMediaInformation("input.mp4");
// iOS
MediaInformation *info = [MobileFFprobe getMediaInformation:@"input.mp4"];
摄像头访问
Android 摄像头录制
FFmpeg.execute("-f android_camera -i 0:0 -r 30 -pixel_format bgr0 -t 00:00:05 output.mp4");
iOS 摄像头录制
[MobileFFmpeg execute: @"-f avfoundation -r 30 -video_size 1280x720 -pixel_format bgr0 -i 0:0 -vcodec h264_videotoolbox -vsync 2 -f h264 -t 00:00:05 %@", outputPath];
高级功能
回调处理
日志回调
// Android
Config.enableLogCallback(new LogCallback() {
public void apply(LogMessage message) {
Log.d(TAG, message.getText());
}
});
// iOS
[MobileFFmpegConfig setLogDelegate:self];
- (void)logCallback:(long)executionId :(int)level :(NSString*)message {
NSLog(@"%@", message);
}
统计回调
// Android
Config.enableStatisticsCallback(new StatisticsCallback() {
public void apply(Statistics newStatistics) {
// 处理统计信息
}
});
// iOS
[MobileFFmpegConfig setStatisticsDelegate:self];
- (void)statisticsCallback:(Statistics *)newStatistics {
// 处理统计信息
}
执行管理
取消执行
// 取消所有执行
FFmpeg.cancel();
// 取消特定执行
FFmpeg.cancel(executionId);
// iOS
[MobileFFmpeg cancel]; // 取消所有
[MobileFFmpeg cancel:executionId]; // 取消特定
列出当前执行
List<FFmpegExecution> executions = FFmpeg.listExecutions();
NSArray* executions = [MobileFFmpeg listExecutions];
版本兼容性
Mobile-FFmpeg 从 4.2 版本开始与 FFmpeg 版本号对齐。以下是一些关键版本对应关系:
MobileFFmpeg 版本 | FFmpeg 版本 | 发布日期 |
---|---|---|
4.4 | 4.4-dev-416 | 2020-07 |
4.3.2 | 4.3-dev-2955 | 2020-04 |
3.1 | 4.1-10 | 2018-12 |
2.0 | 4.0.1 | 2018-06 |
最佳实践
- 选择合适的包:根据项目需求选择最小化的包,减少应用体积
- 错误处理:始终检查命令执行的返回码
- 资源清理:长时间运行的命令要提供取消机制
- 日志记录:在生产环境中合理配置日志级别
- 性能监控:使用统计回调监控处理进度
结语
Mobile-FFmpeg 为移动应用提供了强大的多媒体处理能力,开发者可以轻松实现音视频转码、编辑、分析等功能。通过合理使用其提供的API和功能,可以构建出功能丰富、性能优异的移动多媒体应用。