- ffmpeg 版本列表
- 测试样本
在这之前需要准备以下文件:
- gas-preprocessor
- yasm
- FFmpeg-iOS-build-script
一、在进行编译之前我们需要打开/usr/sbin文件夹的修改权限:
1.在启动电脑的同时按住command + R 进入recover模式
2.进入recover模式后,在电脑的顶部菜单栏,点击打开终端工具
3.运行命令csrutil disable
4.当出现successfully字样,代表关闭成功!
二、安装yasm
1.用命令yasm --version检查是否安装yasm,如果没有安装就按下面步骤安装
2.Download yasm source code:(http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz)
3.cd 到yasm-1.2.0文件夹
4.执行安装命令:./configure && make -j 4 && sudo make install
三、进入下载后的gas-preprocessor文件夹,将文件夹内的gas-preprocessor.pl文件拷贝到/usr/sbin/目录下,然后用下面的命令修改/usr/sbin/gas-preprocessor.pl的文件权限为可执行权限:
chmod 777 /usr/sbin/gas-preprocessor.pl
四、cd 到FFmpeg-iOS-build-script-master文件夹下执行下面的命令,编译ffmpeg
- 编译所有的版本arm64、armv7、x86_64的静态库
./build-ffmpeg.sh
- 合并版本
./build-ffmpeg.sh lipo
- 可用以下命令,查看静态库支持哪些CPU架构:
lipo -info 路径
五、接下来,我们结合kxmovie(一款非常棒的第三方开源流媒体播放器)和我们刚刚编译好的FFmpeg-iOS,来写个Demo练练手
-注意事项1:Demo中我把kxmovie和FFmpeg-iOS都统一放进了文件夹External
-注意事项2:Demo中我用的kxmovie可以去这里下载,下载后把项目中的kxmovie文件夹copy到我们项目中即可
- 1.编译成功后,将FFmpeg-iOS和kxmovie引入到项目下的External文件夹中
-
2.加入以下依赖库
)
- 3.在Build Setting -->Search Paths --> Header Search Paths 添加文件在项目中的路径
由于文件都放在项目的External文件夹下,故:
$(PROJECT_DIR)/External/FFmpeg-iOS/include
4.如果KxMovieDecoder.h缺少头文件#import
,就添加上去 -
5.编译过程中可能遇到的错误:
- 错误1:
Use of undeclared identifier 'PIX_FMT_RGB24'; did you mean 'AV_PIX_FMT_RGB24'?
解决办法:直接按照编译器提示,将 'PIX_FMT_RGB24'改变成'AV_PIX_FMT_RGB24'就行了。
- 错误2:
Implicit declaration of function 'avpicture_deinterlace' is invalid in C99
解决办法:注释掉以下代码
// avpicture_deinterlace((AVPicture*)_videoFrame,
// (AVPicture*)_videoFrame,
// _videoCodecCtx->pix_fmt,
// _videoCodecCtx->width,
// _videoCodecCtx->height);
错误3:
Undefined symbols for architecture armv7:
"_avpicture_deinterlace", referenced from:
-[KxMovieDecoder decodeFrames:] in KxMovieDecoder.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
注:大概的意思是说在KxMovieDecoder文件里面,有一个方法“decodeFrames: ”,在这个方法里面
的"_avpicture_deinterlace"这个方法不能用,armv7结构里面没有这种方法。因此需要找到这个方法直接注释掉
即可。
解决办法:注释掉以下代码。
// avpicture_deinterlace((AVPicture*)_videoFrame,
// (AVPicture*)_videoFrame,
// _videoCodecCtx->pix_fmt,
// _videoCodecCtx->width,
// _videoCodecCtx->height);
- 6.编译成功后,ViewController中加入下面的代码就可以播放了
#import "ViewController.h"
#import "KxMovieViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton*btn = [[UIButton alloc]initWithFrame:CGRectMake(138, 200, 100, 50)];
[btn setBackgroundColor:[UIColor greenColor]];
[btn setTitle:@"播放" forState:UIControlStateNormal];
[btn setTitle:@"播放" forState:UIControlStateHighlighted];
[btn addTarget:self action:@selector(gotoPlayVC) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
-(void)gotoPlayVC{
NSString *path = @"http://v.jxvdy.com/sendfile/w5bgP3A8JgiQQo5l0hvoNGE2H16WbN09X-ONHPq3P3C1BISgf7C-qVs6_c8oaw3zKScO78I--b0BGFBRxlpw13sf2e54QA";
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
// increase buffering for .wmv, it solves problem with delaying audio frames
if ([path.pathExtension isEqualToString:@"wmv"])
parameters[KxMovieParameterMinBufferedDuration] = @(5.0);
// disable deinterlacing for iPhone, because it's complex operation can cause stuttering
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
parameters[KxMovieParameterDisableDeinterlacing] = @(YES);
KxMovieViewController *vc = [KxMovieViewController movieViewControllerWithContentPath:path
parameters:parameters];
[self presentViewController:vc animated:YES completion:nil];
}
- 7.截个图:
本文对应的Demo:https://github.com/zzyyd6316/TestFFMPEG