(三)iOS开发:基于MP4格式的FFmpeg交叉编译

在FFmpeg 简介及iOS端交叉编译一文中介绍了FFmpeg 提供有自己的编解码库,封装了codec层,但是有一些codec是具备自己的License,FFmpeg不会默认集成,例如libx264、FDK_AAC、LAME等,但是FFmpeg就像一个平台,可以将其他的第三方codec以插件的形式添加进来,然后为开发者提供统一的接口。
有同学私信我说能否有详细的编译流程,在此详细介绍一下。

一般情况下,mp4容器封装的视频流编码格式为h264,音频流编码格式为AAC,h264的最佳编解码库为X264,AAC的最佳编解码库为FDK_AAC。因此,整个交叉编译过程实际分为3个部分:交叉编译libx264;交叉编译libfdk_aac;交叉编译FFmpeg。每个编译流程大概分为下载源码、下载并修改编译脚本、交叉编译、合并静态库四个步骤。
其中编译脚本都来源于https://github.com/kewlbear,感谢。

交叉编译libx264

1、下载libx264源码

提供两种形式下载:从官网直接下载或者Git下载,本文都采用官网直接下载。

  • 官网下载libx264源码
  • Git下载:git clone http://git.videolan.org/git/x264.git

2、下载编译脚本

  • 将下载的脚本跟源码放在同一个文件夹下
  • 脚本里面源码SOURCE指向x264,因为将源代码的文件夹修改为x264或者修改脚本SOURCE,我采用的修改文件夹名。
  • 修改脚本ARCHS,因为支持的ARCHS越多,编译的库就越大,按照项目实际需要配置即可。arm64e有arm64兜底,我们的项目基本都是已armv7s开始,所以我这边配置为ARCHS="arm64 armv7s x86_64",配置改了后需要按照实际情况修改脚本。
  • 修改脚本的读写权限 chmod u+x ./build-x264.sh

3、执行脚本./build-x264.sh

(三)iOS开发:基于MP4格式的FFmpeg交叉编译_第1张图片
x264.png

会生成x264-iOS、thin-x264、scratch-x264三个文件夹,其中x264-iOS是合并后的静态库,
可省去第四步合并静态库,如果自己写的脚本最后需要合并静态库。

4、合并静态库

利用lipo命令,将thin-x264对应的各个版本合并成一个,在此不详细讲解,自行百度。

交叉编译libfdk_acc

1、下载fdk-aac源码

2、下载编译脚本

  • 将下载的脚本跟源码放在同一个文件夹下
  • 修改脚本里面源码SOURCE指向fdk_aac,修改源代码的文件夹修改为fdk_aac
  • 修改脚本ARCHS为ARCHS="arm64 armv7s x86_64"
  • 切换到fdk_aac目录下,并执行./autogen.sh
  • 切换到上一级目录,修改脚本的读写权限 chmod u+x ./build-fdk-aac.sh

3、执行脚本./build-fdk-aac.sh

4、执行./build-fdk-aac.sh lipo 命令集成一个lib

交叉编译FFmpeg(包含libx264与libfdk_acc)

注意: 在这里可以仅下载FFmpeg-iOS编译脚本,不用下载源码,执行脚本会自动下载源码,如果不想每次自动下载,可以手动下载源码,稍微修改下FFmpeg编译脚本即可.这里不做过多说明.

1、下载FFmpeg编译脚本,当前(2019.08.13)使用FFmpeg4.2,你可以按照自己的需要在脚本修改FFmpeg版本。

  • 将以上编译的fdk-aac和x264移动到编译脚本下,只需要移动最后一步生成的包含头文件及lib文件的目录。
    (三)iOS开发:基于MP4格式的FFmpeg交叉编译_第2张图片
    资源目录.png
  • 编辑FFmpeg iOS 编译脚本,取消fdk-aac及x264的注释,并修改路径指向对应的目录


    (三)iOS开发:基于MP4格式的FFmpeg交叉编译_第3张图片
    脚本修改.png
  • 同libx264、libfdk_acc一样,修改脚本ARCHS为ARCHS="arm64 armv7s x86_64"

  • fdk-aac需要添加--enable-nonfree选项,修改CONFIGURE_FLAGS为CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \ --disable-doc --enable-pic --enable-nonfree"

3、执行脚本./build-ffmpeg.sh,等待下载和编译。

4、执行./build-ffmpeg.sh lipo 命令集成一个lib,最后生成的FFmpeg-iOS目录即为fat版本,包含我需要的arm64、armv7s以及64位模拟器x86_64。

结束语

  • FFmpeg的强大无需多言,FFmpeg的使用在后期会分为Tool调用和API使用两个方向详解。
  • iOS集成FFmpeg的流程参考,记得添加依赖:
    libbz2.tbd
    libz.tbd
    libiconv.tbd
    CoreMedia.framework
    VideoToolbox.framework
    AudioToolbox.framework
    AVFoundation.framework

因为版本在不断更新,每个团队需要支持的ARCHS不同,仅供参考。
Tips:上传到git发现太大了,没上传,需要的私信我。

问题

我再编译FFmpeg后集成fftools出现真机能正常编译,模拟器出现问题,如下图:


(三)iOS开发:基于MP4格式的FFmpeg交叉编译_第4张图片
D5EF38B4EF452C73909CC48CBA4EAC73.png

两个方法:

  • 修改config.h里面的CONFIG_AVDEVICE为#define CONFIG_AVDEVICE 0即可,因为avdevice需要连接sdl2库。
  • 在交叉编译前指定不需要avdevice库,即--disable-avdevice。

当然,如果你需要使用ffplay,那必须使用avdevice库,那必须先编译sdl2。


如果喜欢,请帮忙点赞。支持转载,转载请附原文链接。

你可能感兴趣的:((三)iOS开发:基于MP4格式的FFmpeg交叉编译)