美文网首页
FFmpeg集成

FFmpeg集成

作者: WTF丶程序猿 | 来源:发表于2021-03-15 11:53 被阅读0次

    一、选用FFmpeg编译脚本

    集成FFmpeg初学者使用的脚本是FFmpeg-iOS-build-script,该脚本将自动下载FFmpeg源码并提供编译选项,但是需要第三方库编译的选项将很难编译成功。如需要文字水印的--enable-libfreetype和--enable-libfontconfig,需要另外下载第三方库freetype、fontconfig的源码和源码对应编译脚本。

    因此,我这里推荐使用的脚本是mobile-ffmpeg,地址是

    https://github.com/tanersener/mobile-ffmpeg

    这脚本含有第三方库源码和编译脚本,为ffmpeg的编译提供极大便利。

    二、FFmpeg编译准备工具

    1.Xcode 8和Command Line Tools for Xcode8

    苹果官网下载特定Xcode8版本地址:下载Xcode8

    下载Xcode

    左侧选择Developer Tools,右侧选择Xcode8和Command Line Tools下载并安装。

    为什么这里需要使用Xcode8呢?

    因为使用高版本Xcode编译出来的静态库支持的cpu架构是arm64和x86_64,其它cpu架构是不支持的.

    所以我这里为了支持arm64、x86_64、i386和armv7这4种cpu架构,使用Xcode8编译。

    当然,如果不需要多cpu架构的话可以使用最新的xcode版本进行编译

    如果已有高版本Xcode怎么办?

    如果已有高版本Xcode也可以下载Xcode8,并将编译组件切换到xcode8即可。

    如我下载后安装在D盘,安装时将Xcode改名成Xcode8,以便区分。

    输入以下命令即可切换:

    sudo xcode-select -s /Volumes/D/Xcode8.app

    2.下载安装gas-preprocessor

    sudo git clone https://github.com/bigsen/gas-preprocessor.git  /usr/local/bin/gas    

    sudo cp /usr/local/bin/gas/gas-preprocessor.pl /usr/local/bin/gas-preprocessor.pl

    sudo chmod u+x /usr/local/bin/gas-preprocessor.pl

    sudo rm -rf /usr/local/bin/gas/

    3.下载安装yams

    curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz -o yasm-1.2.0.gz

    tar -zxvf yasm-1.2.0.gz

    cd yasm-1.2.0

    ./configure && make -j 4 && sudo make install

    三、FFmpeg编译

    下载mobile-ffmpeg完成后,执行ios.sh脚本

    cd /Volumes/D/mobile-ffmpeg-master        // 切换到目标目录

    ./ios.sh --disable-arm64e                            // --diable-arm64e 不需要arm64e架构

    编译成功显示ok

    在当前目录下会产生prebuilt文件夹,文件夹内含有我所需要的ffmpeg静态库.a文件

    生成目录

    我们取ffmpeg静态库.a文件,位于文件夹prebuilt/ios-universal/ffmpeg-universal文件夹中

    ios-arm64-apple-darwin和其它cpu架构合成之后就放到ios-universal文件夹下

    到这里,我们已经成功编译出ffmpeg静态库了。

    四、FFmpeg集成到Xcode项目中

    FFmpeg使用方式有2种,直接使用静态库;使用fftools,通过ffmpeg命令行调用ffmpeg。

    1.新建Xcode工程

    新建项目ios_FFmpeg_Demo,拷贝以下2个目录中的文件到工程中:  

    fftools

    ./mobile-ffmpeg-master/src/ffmpeg/fftools 文件夹中只保留ffmpeg.h/.c、cmdutils.h/.c、ffmpeg_opt.c、ffmpeg_filter.c、ffmpeg_hw.c,其余文件删除

    ffmpeg_lib

    ./mobile-ffmpeg-master/prebuilt/ios-universal/ffmpeg-universal文件夹中删除LICENSE文件

    2.设置搜索的头文件路径

    $(PROJECT_DIR)/iOS_FFmpeg_Demo/ffmpeg-universal/include

    设置头文件路径

    3.增加链接库

    Target-Build Phases-Link Binary With Libraries中加入以下库:

    4.解决编译报错问题

    1).编译报错

    编译报错有一些头文件无法找到,我们直接将其屏蔽

    #include "compat/va_copy.h"

    #include "libavresample/avresample.h"

    #include "libpostproc/postprocess.h"

    PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);

    PRINT_LIB_INFO(postproc,  POSTPROC,  flags, level);

    2).另外一些编译报错如图所示:

    Invalid instruction mnemonic 'movgt'

    我们可以直接找到调用该函数的地方,将其屏蔽。搜索mid_pred调用的地方。

    mid_pred屏蔽

    3).函数名字重复

    函数名重复

    这里是指main函数在main和ffmpeg中重复了,故我们修改ffmpeg.c中的main函数,变成ffmpeg_main

    修改主函数名

    4).提供接口调用

    在ffmpeg.h文件中定义在上一步修改的函数名ffmpeg_main,提供接口调用

    定义接口

    5).调用优化

    问题1:ffmpeg.c的代码中会访问空属性导致程序崩溃

    解决方法:在ffmpeg.c中 找到ffmpeg_cleanup方法,在 term_exit() 前,将各个计数器置零:

    static void ffmpeg_cleanup(int ret)

    {

    ........................

    nb_filtergraphs=0;

    nb_output_files=0;

    nb_output_streams=0;  

    nb_input_files=0;

    nb_input_streams=0;

    term_exit();

    ffmpeg_exited = 1;

    }

    问题2:命令执行结束退出程序的问题

    FFmpeg 默认执行完会执行 exit_program 方法结束进程,而iOS下只能启动一个进程,如果默认不做处理,执行完一条命令后app就自动退出了,所以需要做一个处理。

    解决方案:命令执行完不进行结束线程和进程,只进行 cleanup。

    在 ffmpeg.c 的 ffmpeg_main 函数中,把所有调用 exit_program 函数 ,改为调用 ffmpeg_cleanup 函数就可以了。

    5).测试调用

    在ViewController.m中包含ffmpeg.h文件,调用ffmpeg_main接口

    调用ffmpeg_main接口

    四、结束

    本文demo:

    以上步骤可接入ffmpeg库并输入命令行使用,但mobile-ffmpeg脚本是如何运行的,我在下一篇中将会简单分析。并且我会以文字水印为例讲述如何使用该脚本编译第三方库freetype、fontconfig,可看到该脚本的便利性

    参考资料:https://juejin.im/entry/5c20fddd6fb9a049d37f1ed5

    作者:小影X

    链接:https://www.jianshu.com/p/52d242482dec

    来源:简书

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:FFmpeg集成

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