美文网首页
使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X

使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X

作者: 高呼吾名 | 来源:发表于2021-04-07 12:07 被阅读0次

    FFmpeg 在linux下编译后默认是不包含H264编码器(也就是x264)的
    如果需要在安卓下使用FFmpeg进行h264解码可以直接下载 FFmpeg源码编译即可。
    如需使用FFmpeg 进行h264编码 则需先下载x264源码使用NDK交叉编译出x264的静态库文件

    1.下载NDK

    下载地址:不受支持的 NDK 下载 | Android NDK | Android Developers (google.cn)
    版本:修订版 14b (r14b)

    1.jpg

    下载完成后上传到Ubuntu的用户目录下,进行解压后即可。

    2.下载x264源码,编译动态链接库

    下载地址:x264, the best H.264/AVC encoder - VideoLAN

    2.jpg

    下载完成后上传到Ubuntu 的用户目录下(~)解压后得到 x264-master 文件夹(即源码文件)

    2.1 进入x264-master 文件夹
    2.2 创建一个文件夹名称为static作为x264的安装目录(也可以不创建 编译完后直接安装usr 下,建议创建一个)
    2.3 创建一个build_x264.sh shell 脚本文件

    shell 脚本创建出来时需要赋予可执行权限。

    chmod +x build_x264.sh
    
    2.4 编辑build_x264.sh
    #!/bin/bash -v                                                                          2
    #NDK的目录
    NDK=/root/ff/android-ndk-r14b
      
    #这里的两个目录需要和等会编译ffmpeg时保持一致 否则会出现找不到x264的错误
    PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    PLATFORM=$NDK/platforms/android-21/arch-arm
      
    #编译后进行make install 时的目录
    PREFIX=/root/x264-master-test/static
     
    echo "开始编译x264"
    ./configure --prefix=$PREFIX \
    --enable-static \
    --enable-pic \
    --disable-asm \
    --disable-cli \
    --host=arm-linux \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi-  \
    --sysroot=$PLATFORM
    
    make -j16
    
    echo "编译结束!"
    
    2.5 到这里可能报错./configure 没有权限

    /configure: Permission denied 给 ./configure 文件赋予权限即可

    chmod +x ./configure 
    

    再次执行build_x264.sh 文件 此时会提示

    ./config.guess: Permission denied
    ./config.sub: Permission denied
    分别给这俩个文件赋予权限

    chmod +x ./config.guess
    chmod +x ./config.sub
    

    再次执行build_x264.sh 文件 仍然会提示权限错误 = =!
    但此时其实.configure 已经配置完成了,是make 时的权限有问题 。

    ./tools/cltostr.sh: Permission denied

    chmod +x ./tools/cltostr.sh
    

    再次执行build_x264.sh 文件 = =! 然后还会报一个错

    'X264_VERSION' undeclared
    在网上查了好久 说改版本号什么的都不好用,其实这里还是因为权限的问题。

    chmod +x version.sh
    

    不知道有没有什么好办法能在shell里或者其他地方 能让它自动赋予给这些需要权限的文件权限。不会linux 只能这样一步一步-,-

    到这里基本就编译完了。
    2.6 安装 这一步也可以写在build_x264.sh 里
    make install
    
    3.jpg
    4.jpg

    到这里 x264 算是安装完成

    3.下载FFmpeg源码进行编译

    下载地址:GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git
    版本:release-3.4

    5.jpg

    下载完成后上传到Ubuntu 的用户目录下(~)解压后得到 FFmpeg-release-3.4文件夹(即源码文件)

    3.1 进入FFmpeg-release-3.4文件夹
    3.2 创建一个build_ffmpeg.sh 脚本文件,并赋予执行权限(chmod +x build_ffmpeg.sh)
    3.3.1 编辑build_ffmpeg.sh (armeabi-v7a)
    #!/bin/bash -v
    echo "进入编译ffmpeg脚本"
    
    #NDK目录 需和编译x264时的路径一直
    NDK=/root/ff/android-ndk-r14b
    
    #需和编译x264时的路径一直
    PLATFORM=$NDK/platforms/android-21/arch-arm
    
    #这个路径对应的build_x264.sh里的PREBUILT都是自定义变量名 非固定写法
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    CPU=armv7-a
    #输出路径
    PREFIX=./android/$CPU
    function buildFF
    {
        echo "开始编译ffmpeg"
        ./configure \
        --prefix=$PREFIX \
        --target-os=android \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --arch=arm \
        --cpu=$CPU  \
        --sysroot=$PLATFORM \
        --extra-cflags="$CFLAG" \
         #x264编译安装后的头文件路径
        --extra-cflags="-I/root/x264-master-test/static/include " \
        #x264编译安装后的库文件路径   
        --extra-ldflags="-L/root/x264-master-test/static/lib" \
        --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
        --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
        --enable-shared \
        --enable-runtime-cpudetect \
        --enable-small \
        --enable-cross-compile \
        --enable-static \
        --enable-libx264 \
        --enable-gpl \
        --disable-x86asm \
        --disable-debug \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-postproc \
        --disable-avdevice \
        --disable-symver \
        --disable-stripping \
        $ADD 
        make -j16
        echo "编译结束!"
    }
    
    ###########################################################
    echo "编译不支持neon和硬解码"
    CPU=armv7-a
    PREFIX=./android/$CPU
    CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
    ADD=
    buildFF
    
    3.3.2 编辑build_ffmpeg_arm64v8-a.sh (arm64v8-a)
    #!/bin/bash -v                                                                                                                                             2 echo "进入echo "进入编译ffmpeg脚本"
    #NDK目录 需和编译x264时的路径一直
    NDK=/root/ff/android-ndk-r14b
    
    
    #需和编译x264时的路径一直
    PLATFORM=$NDK/platforms/android-21/arch-arm64
    
    #这个路径对应的build_x264.sh里的PREBUILT都是自定义变量名 非固定写法
    TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
    
    CPU=armv8-a
    #输出路径
    PREFIX=./android/$CPU
    
    
    function buildFF
    {
        echo "开始编译ffmpeg"
        ./configure \
         --prefix=$PREFIX \
         --target-os=android \
         --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
         --arch=aarch64 \
         --cpu=armv8-a \
         --sysroot=$PLATFORM \
         --extra-cflags="$CFLAG" \
          #x264编译安装后的头文件路径
          --extra-cflags="-I/root/x264-master-test/static/armv64-v8a/include " \
          #x264编译安装后的库文件路径
          --extra-ldflags="-L/root/x264-master-test/static/armv64-v8a/lib " \
          --enable-shared \
          --enable-runtime-cpudetect \
          --enable-small \
          --enable-cross-compile \
          --enable-static \
          --enable-libx264 \
          --enable-gpl \
          --disable-asm \
          --disable-debug \
          --disable-doc \
          --disable-ffmpeg \
          --disable-ffplay \
          --disable-ffprobe \
          --disable-ffserver \
          --disable-postproc \
          --disable-avdevice \
          --disable-symver \
          --disable-stripping \
          $ADD
          make -j16
          echo "编译结束"
     }
     
      ###########################################################
     echo "编译不支持neon和硬解码"
     CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp"
     buildFF
    
    3.4 执行make install 进行安装
    6.jpg

    相关文章

      网友评论

          本文标题:使用NDK在Ubuntu16.01.12交叉编译FFmpeg+X

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