前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(三)iOS开发:基于MP4格式的FFmpeg交叉编译

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

作者头像
sweet说好的幸福
发布2020-12-23 09:58:00
9280
发布2020-12-23 09:58:00
举报
文章被收录于专栏:sweet_iOS

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下载,本文都采用官网直接下载。

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

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文件的目录。

资源目录.png

  • 编辑FFmpeg iOS 编译脚本,取消fdk-aac及x264的注释,并修改路径指向对应的目录

脚本修改.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出现真机能正常编译,模拟器出现问题,如下图:

D5EF38B4EF452C73909CC48CBA4EAC73.png

两个方法:

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

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 交叉编译libx264
    • 1、下载libx264源码
      • 2、下载编译脚本
        • 3、执行脚本./build-x264.sh
          • 4、合并静态库
          • 交叉编译libfdk_acc
            • 1、下载fdk-aac源码
              • 2、下载编译脚本
                • 3、执行脚本./build-fdk-aac.sh
                  • 4、执行./build-fdk-aac.sh lipo 命令集成一个lib
                  • 交叉编译FFmpeg(包含libx264与libfdk_acc)
                    • 1、下载FFmpeg编译脚本,当前(2019.08.13)使用FFmpeg4.2,你可以按照自己的需要在脚本修改FFmpeg版本。
                      • 3、执行脚本./build-ffmpeg.sh,等待下载和编译。
                        • 4、执行./build-ffmpeg.sh lipo 命令集成一个lib,最后生成的FFmpeg-iOS目录即为fat版本,包含我需要的arm64、armv7s以及64位模拟器x86_64。
                        • 结束语
                        • 问题
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档