FFmpeg-iOS
ffmpeg-iOS制作
- ++腳本地址git地址++
- 在build-ffmpeg.sh 文件內(nèi)修改ffmpeg版本號
- 保證build-ffmpeg-iOS-framework.sh 文件內(nèi)的 ++FFMPEG_VERSION++ 小于等于 build-ffmpeg.sh 文件內(nèi)的版本號,否則制作失敗
- 運行腳本,開始制作ffmpeg-iOS
./build-ffmpeg.sh
檢測制作的ffmepg-iOS是否可用
新建project,將上面制作好的FFmpeg-iOS添加到新project中
-
隨便一個文件中添加一個頭文件引用
include "avformat.h"
-
在同一文件下,添加一段測試代碼
av_register_all();
將project下任一.m 文件改成 .mm 結(jié)尾,(開啟c++自動混編模式)
編譯project,看能否通過
制作可以命令行調(diào)用的靜態(tài)庫
- XCode創(chuàng)建靜態(tài)庫project
- 導(dǎo)入以下文件
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 (關(guān)閉只生成 支持一個架構(gòu)的靜態(tài)庫)
- 修改ffmpeg.c的main函數(shù),因為一個程序不能有倆個main函數(shù)
// int main(int argc, char **argv)
int ffmpeg_main(int argc, char **argv)
- cmdutils.c修改函數(shù)exit_program,cmdutils.h文件同時修改頭文件
int exit_program(int ret)
{
// if (program_exit)
// program_exit(ret);
//
// exit(ret);
return ret;
}
- ffmpeg.c文件中,計數(shù)器置零, 在 term_exit(); 前面將5個參數(shù)置零(修復(fù)多次調(diào)用可能引起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;
- 分別選擇模擬器和真機運行,并分別取出靜態(tài)庫進行合并
lipo -create **.a **.a -output **.a
- 檢查生成的靜態(tài)庫是否支持4中架構(gòu)
$ lipo -info libPPFFmpeg.a
Architectures in the fat file: libPPFFmpeg.a are: armv7 i386 x86_64 arm64 // 返回結(jié)果包含四個架構(gòu)
將靜態(tài)庫導(dǎo)入實際需要使用的項目中使用
- 將生成的靜態(tài)庫放入到FFmpeg-iOS/lib/路徑下,并將FFmpeg-iOS導(dǎo)入項目中
- Build Settings --> Header Search Paths 下添加FFmpeg-iOS/include路徑
- 添加系統(tǒng)庫文件
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轉(zhuǎn)mp4完成 = %@", filePath);
});