简单记录下编译的问题。
这里我使用的是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、
如果这时候提示
路径找不到
或者开始编译了,但编译一半提示错误
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都设置相同的,就没问题了。
5、在Xcode中使用
终于编译完了支持H264编码的ffmpeg库了。但拖到xcode中,发现还是提示有问题。
这是没把libx264.a导进来导致的。
本来打算再编译H265编码的。发现libx265库的编译方式不太一样。现在还没嵌入到ffmpeg中。这个有待研究。
网友评论