FFmpeg-iOS
ffmpeg-iOS制作
- ++脚本地址git地址++
- 在build-ffmpeg.sh 文件内修改ffmpeg版本号
- 保证build-ffmpeg-iOS-framework.sh 文件内的 ++FFMPEG_VERSION++ 小于等于 build-ffmpeg.sh 文件内的版本号,否则制作失败
- 运行脚本,开始制作ffmpeg-iOS
./build-ffmpeg.sh
检测制作的ffmepg-iOS是否可用
新建project,将上面制作好的FFmpeg-iOS添加到新project中
-
随便一个文件中添加一个头文件引用
include "avformat.h"
-
在同一文件下,添加一段测试代码
av_register_all();
将project下任一.m 文件改成 .mm 结尾,(开启c++自动混编模式)
编译project,看能否通过
制作可以命令行调用的静态库
- XCode创建静态库project
- 导入以下文件
cmdutils_common_opts.h
cmdutils.c
cmdutils.h
config.h
ffmpeg_filter.c
ffmpeg_opt.c
ffmpeg_videotoolbox.c
ffmpeg.c
ffmpeg.h
ffprobe.c
其中config.h 文件为scratch目录下arm64/armv7/i386/x86_64任一文件夹下的config.h文件
- project中 Build Settings --> Header Search Paths 下添加 在生成的ffmpeg-iOS库中 ../FFmpeg-iOS/include 的完整路径以及 ../ffmpeg-4.0.3 的完整路径
- 修改 Build Setting --> Build Active Architechure Only 为NO (关闭只生成 支持一个架构的静态库)
- 修改ffmpeg.c的main函数,因为一个程序不能有俩个main函数
// int main(int argc, char **argv)
int ffmpeg_main(int argc, char **argv)
- cmdutils.c修改函数exit_program,cmdutils.h文件同时修改头文件
int exit_program(int ret)
{
// if (program_exit)
// program_exit(ret);
//
// exit(ret);
return ret;
}
- ffmpeg.c文件中,计数器置零, 在 term_exit(); 前面将5个参数置零(修复多次调用可能引起crash)
nb_filtergraphs=0;
nb_output_files=0;
nb_output_streams=0;
nb_input_files=0;
nb_input_streams=0;
term_exit();
ffmpeg_exited = 1;
- 分别选择模拟器和真机运行,并分别取出静态库进行合并
lipo -create **.a **.a -output **.a
- 检查生成的静态库是否支持4中架构
$ lipo -info libPPFFmpeg.a
Architectures in the fat file: libPPFFmpeg.a are: armv7 i386 x86_64 arm64 // 返回结果包含四个架构
将静态库导入实际需要使用的项目中使用
- 将生成的静态库放入到FFmpeg-iOS/lib/路径下,并将FFmpeg-iOS导入项目中
- Build Settings --> Header Search Paths 下添加FFmpeg-iOS/include路径
- 添加系统库文件
AudioToolbox.framework
CoreMedia.framework
VideoToolbox.framework
libiconv.tdb
libbz2.tdb
libz.tdb
- 在使用ffmpeg命令行文件中添加声明 extern int ffmpeg_main(int argc, char * argv[]);
NSString *totalTsPath = [NSString stringWithFormat:@"../input.ts"];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *filePath = [NSString stringWithFormat:@"../out.mp4"];
char *movie = (char *)[totalTsPath UTF8String];
char *outPic = (char *)[filePath UTF8String];
char* a[] = {
"ffmpeg",
"-i",
movie,
"-acodec",
"copy",
"-vcodec",
"copy",
outPic
};
ffmpeg_main(sizeof(a)/sizeof(*a), a);
NSLog(@"ts转mp4完成 = %@", filePath);
});