美文网首页程序员
28.Android Studio下FFmpeg的编译和使用(二

28.Android Studio下FFmpeg的编译和使用(二

作者: 任振铭 | 来源:发表于2018-09-26 08:16 被阅读4次

    项目源码
    编译过程中涉及到很多ndk中的so库和头文件以及交叉编译的工具,在命令执行的时候会在ndk相应的目录下去查找,所以我们可以使用export命令事先将这些路径设置到环境变量,使用的时候可以很方便的找到

    //NDK加入环境变量,以我的ndk存放路径为例
    export NDK=/root/renzhenming/ffmpeg/android-ndk-r14b
    
    //ndk的platforms文件夹中存放的是各个版本架构下的so库和头文件
    export PLATFORM=$NDK/platforms/android-21/arch-arm
    
    //指定交叉编译工具的路径
    export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    //指定输出类型,以armv7-a为例
    export CPU=armv7-a
    
    //指定so文件编译后的输出路径
    export PREFIX=./android/$CPU
    
    相关命令解析

    脚本中定义了一个方法build_ffmpeg,最终它被调用两次生成支持neon和硬解码的so库和不支持neon和硬解码的so库
    configure :是ffmpeg中已有的一个配置文件,我们的脚本其实也就是去执行这个文件,所有生成so的工作都在这里进行

    prefix : 指定最终生成的so的安装目录

    target-os : 指定目标系统,早期很多脚本在2.x上把这个指定为linux,可以,但是ffmpeg更新之后,在3.x的版本之上会导致问题,头文件找不到之类的,这是一点差异

    cross-prefix:指定交叉编译的前缀,在交叉编译的情况下,比如交叉编译使用的gcc,那么会在gcc前加上这个前缀,就是一个完整的gcc工具的路径,可以通过这个路径找到这个工具(/home/renzhenming/ffmpeg/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc)

    sysroot:指定这套系统依赖的库和头文件位置,就是我们配置的PLATFORMS,交叉编译在本系统中是找不到这些库的,可以把这些库看作是交叉编译的环境

    extra-cflags:给gcc提供的一系列参数,这个可配可不配。 -fPIC编译动态链接库的参数, -mfpu指定协处理器,-mfloat-abi=softfp软浮点

    nm:符号查看工具

    enable-shared:编译成动态库,大概在3.4之前的ffmpeg版本,我们编译的时候需要修改configure文件中的一些参数,因为默认生成的so库文件名有问题,无法直接调用,3.4不再需要手动修改

    enable-runtime-cpudetect :开启运行期cpu检测,不支持的指令可以自动被替换

    enable-gpl:ffmpeg要求商用中如果开启这个gpl,那么你的代码要开源,否则不准开启,不开启有些库无法使用

    enable-small:打出来的so更小

    enable-asm:允许汇编,指令优化

    支持硬解码,打开后jni可以调用java的源码
    --enable-jni
    --enable-mediacodec
    解码器
    --enable-decoder=h264_mediacodec
    硬件加速
    --enable-hwaccel=h264_mediacodec \

    完整的编译脚本
    #!/bin/bash
    echo "开始编译ffmpeg"
    #配置ndk的路径
    NDK=/home/renzhenming/ffmpeg/android-ndk-r14b
    #指定Android版本指定架构的so库和头文件
    PLATFORM=$NDK/platforms/android-21/arch-arm
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    CPU=armv7-a
    #输出路径
    PREFIX=./android/$CPU
    function build_ffmpeg
    {
        echo "开始编译ffmpeg"
        ./configure \
        --prefix=$PREFIX \
        --target-os=android \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --arch=arm \
        --cpu=$CPU  \
        --sysroot=$PLATFORM \
        --extra-cflags="$CFLAG" \
        --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
        --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
        --enable-shared \
        --enable-runtime-cpudetect \
        --enable-gpl \
        --enable-small \
        --enable-cross-compile \
        --disable-debug \
        --disable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-postproc \
        --disable-avdevice \
        --disable-symver \
        --disable-stripping \
        $ADD 
        make -j16
        make install
        echo "编译结束!"
    }
    ###########################################################
    echo "编译支持neon和硬解码"
    CPU=armv7-a
    PREFIX=./android/armv7-a-neon-hard
    CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
    ADD="--enable-asm \
        --enable-neon \
        --enable-jni \
        --enable-mediacodec \
        --enable-decoder=h264_mediacodec \
        --enable-hwaccel=h264_mediacodec "
    build_ffmpeg
    
    ###########################################################
    echo "编译不支持neon和硬解码"
    CPU=armv7-a
    PREFIX=./android/$CPU
    CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
    ADD=
    build_ffmpeg
    

    相关文章

      网友评论

        本文标题:28.Android Studio下FFmpeg的编译和使用(二

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