簡單記錄下編譯的問題处窥。
這里我使用的是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庫是有,但你發(fā)現(xiàn)是不支持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"
編譯后椿肩,發(fā)現(xiàn)有問題: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
#加入關聯(lián)的include
FFMPEG_CFLAGS="$FFMPEG_CFLAGS -I$FFMPEG_X264_INCLUDE"
#加入關聯(lián)的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中,發(fā)現(xiàn)還是提示有問題达箍。
這是沒把libx264.a導進來導致的没龙。
本來打算再編譯H265編碼的。發(fā)現(xiàn)libx265庫的編譯方式不太一樣《忻担現(xiàn)在還沒嵌入到ffmpeg中硬纤。這個有待研究。