IOS-FFmpeg的编译

简单记录下编译的问题。

这里我使用的是FFmpegCompileTool-master进行IOS平台FFmpeg的编译。
三个比较重要的文件:
compile-ffmpeg.sh:总控制中心,可在这里修改需编译的平台,如arm64
module-lite-hevc.sh(等等):具体需要ffmpeg支持的功能,如--enable-libx264
do-compile-ffmpeg.sh:进一步完善编译需要的信息,如加入支持的第三方库

按照这个说明文档,很快可以编译成功。有个地方需要修改下:compile-ffmpeg.sh下的FF_ALL_ARCHS_IOS8_SDK="arm64",我改为只支持arm64平台,这样编出来的ffmpeg库是可以直接在代码上使用的。要编译armv7平台是会出问题的。

ffmpeg库是有,但你发现是不支持H264的编码。

为了支持H264编码,后面的操作耗费了我相当多的时间。当然也有收获的,至少把FFmpegCompileTool的编译流程弄懂了。

1、
config/module-lite-hevc.sh,加入下面,开启libx264。这里我使用了module-lite-hevc.sh,而不是默认的module.sh。
具体修改tools/do-compile-ffmpeg.sh(也可以用以前的)

#export COMMON_FF_CFG_FLAGS=
#source $FF_BUILD_ROOT/../config/module.sh
export COMMON_FF_CFG_FLAGS=
source $FF_BUILD_ROOT/config/module-lite-hevc.sh
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-gpl"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=libx264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-libx264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=h264"

编译后,发现有问题:ERROR: libx264 not found

2、需要加入第三方库libx264
下载libx264源码,然后进行编译,下面是我的build.sh

#!/bin/sh
export AS="gas-preprocessor.pl -arch arm -- xcrun -sdk iphoneos clang"
export CC="xcrun -sdk iphoneos clang"
./configure \
--enable-static \
--enable-pic \
--disable-asm \
--disable-shared \
--host=arm-apple-darwin \
--extra-cflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \
--extra-asflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \
--extra-ldflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \
--prefix="./outlib/arm64" \
make clean
make -j8
make install

3、引用libx264
在do-compile-ffmpeg.sh加入引用

# with openssl
if [ -f "${FFMPEG_DEP_OPENSSL_LIB}/libssl.a" ]; then
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS --enable-openssl"

    FFMPEG_CFLAGS="$FFMPEG_CFLAGS -I${FFMPEG_DEP_OPENSSL_INC}"
    FFMPEG_DEP_LIBS="$FFMPEG_CFLAGS -L${FFMPEG_DEP_OPENSSL_LIB} -lssl -lcrypto"
fi

#下面是加入的部分
FFMPEG_X264_INCLUDE=externalLibs/x264/include/
FFMPEG_X264_LIB=externalLibs/x264/lib/
#FFMPEG_X264_INCLUDE=/usr/local/include
#FFMPEG_X264_LIB=/usr/local/lib
#FFMPEG_X264_LIB=$FF_BUILD_ROOT/build/externalLibs/x264/lib
#加入关联的include
FFMPEG_CFLAGS="$FFMPEG_CFLAGS -I$FFMPEG_X264_INCLUDE"
#加入关联的Lib
FFMPEG_LDFLAGS="$FFMPEG_LDFLAGS -L$FFMPEG_X264_LIB"

目的是为了得到类似:--extra-ldflags=-arch arm64 -miphoneos-version-min=8.0 -L/usr/local/lib的写法

当然,编译好的libx264的include与lib放到
FFmpegCompileTool-master/ffmpeg/externalLibs/x264/,新建的文件名可以自己定。

4、编译的一些错误
(1)如果这时候提示,libx264.a库找不到找不到,或者开始编译了,但编译一半提示错误
ERROR: libx264 not found
invalid instruction mnemonic rev16 asm(rev16 %w0, %w0 : +r(x))

基本上都是libx264库与ffmpeg不匹配。不匹配的总要的一点,大家是否都是开启了bitcode。
在FFmpegCompileTool中,ffmpeg默认是开启的,要关闭,就修改

elif [ "$FF_ARCH" = "armv7s" ]; then
    FF_BUILD_NAME="ffmpeg-armv7s"
    FF_BUILD_NAME_OPENSSL=openssl-armv7s
    FFMPEG_CFG_CPU="--cpu=swift"
    FF_XCRUN_OSVERSION="-miphoneos-version-min=6.0"
    FF_XCODE_BITCODE="-fembed-bitcode"
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS $FFMPEG_CFG_FLAGS_ARM"
elif [ "$FF_ARCH" = "arm64" ]; then
    FF_BUILD_NAME="ffmpeg-arm64"
    FF_BUILD_NAME_OPENSSL=openssl-arm64
    FF_XCRUN_OSVERSION="-miphoneos-version-min=8.0"
    FF_XCODE_BITCODE="-fembed-bitcode"
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS $FFMPEG_CFG_FLAGS_ARM"
    FF_GASPP_EXPORT="GASPP_FIX_XCODE5=1"

找到对应的平台,要关闭bitcode功能,就注释:
FF_XCODE_BITCODE="-fembed-bitcode"

对应的libx264库,要支持bitcode就加上:

-extra-cflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \
--extra-asflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \
--extra-ldflags="-arch arm64 -mios-version-min=7.0 -fembed-bitcode" \

要取消bitcode就去掉后面的-fembed-bitcode。

只要ffmpeg和libx264都设置相同的,就没问题了。

(2)编译armv7平台,提示:libswresample/arm/audio_convert_neon.S:25:1: error: invalid symbol redefinition
_swri_oldapi_conv_flt_to_s16_neon:

修改:Delete _swri_oldapi_conv_flt_to_s16_neon: and _swri_oldapi_conv_fltp_to_s16_2ch_neon:.
Change _swri_oldapi_conv_flt_to_s16_neon to X(swri_oldapi_conv_flt_to_s16_neon) and _swri_oldapi_conv_fltp_to_s16_2ch_neon to X(swri_oldapi_conv_fltp_to_s16_2ch_neon)

5、在Xcode中使用
终于编译完了支持H264编码的ffmpeg库了。但拖到xcode中,发现还是提示有问题。
这是没把libx264.a导进来导致的。

本来打算再编译H265编码的。发现libx265库的编译方式不太一样。现在还没嵌入到ffmpeg中。这个有待研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容