音视频编码学习杂记1:ffmpeg的编译

  • 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.加入以下依赖库


    ku.png

    )

  • 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.截个图:
音视频编码学习杂记1:ffmpeg的编译_第1张图片
1.png
音视频编码学习杂记1:ffmpeg的编译_第2张图片
2.png

本文对应的Demo:https://github.com/zzyyd6316/TestFFMPEG

你可能感兴趣的:(音视频编码学习杂记1:ffmpeg的编译)