美文网首页
IOS-FFmpeg的编译

IOS-FFmpeg的编译

作者: Johnny_Wu | 来源:发表于2019-08-14 20:24 被阅读0次

    简单记录下编译的问题。

    这里我使用的是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中。这个有待研究。

    相关文章

      网友评论

          本文标题:IOS-FFmpeg的编译

          本文链接:https://www.haomeiwen.com/subject/kugnjctx.html