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中。这个有待研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容