美文网首页
音视频编码学习杂记1:ffmpeg的编译

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

作者: 木格措的天空 | 来源:发表于2017-08-29 18:28 被阅读53次

    在这之前需要准备以下文件:

    一、在进行编译之前我们需要打开/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 <UIKit/UIKit.h>,就添加上去

    • 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.png 2.png

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

    相关文章

      网友评论

          本文标题:音视频编码学习杂记1:ffmpeg的编译

          本文链接:https://www.haomeiwen.com/subject/zwlodxtx.html