美文网首页
ffmpeg交叉编译-2ffmpeg编译参数

ffmpeg交叉编译-2ffmpeg编译参数

作者: 有心人2021 | 来源:发表于2021-04-02 10:32 被阅读0次

    ffmpeg编译还是挺繁琐的,里面的参数需要消化,然后配置出自己需要的,arm64-v8a相应的网上比较少,想用这种试试,都是armeabi的多,这种cpu现在很少了。

    1. 版本

    ffmpeg:ffmpeg-4.3
    ndk:android-ndk-r20

    目标:arm64-v8a下的.so /include

    #可自己辨别下,这边完成编译后,再回头写的,可能解压的文件名不是这个
    wget http://www.ffmpeg.org/releases/ffmpeg-4.3.2.tar.xz
    tar -zxvf ffmpeg-4.3.2.tar.xz
    cd ffmpeg-4.3
    touch build.sh
    #修改操作权限,可读写执行
    chmod 777 build.sh
    vim build.sh
    
    

    build.sh配置如下

    # NDK=${NDKROOT},$NDKROOT为ndk的根目录
    # 注意:ndk-r20不再使用以前r18等版本的路径<以前版本的路径也是做了内部调用,指向/llvm/下+target等参数>,r20下等较新需要改为llvm/
    SYSROOT=$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    #TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录
    TOOLCHAIN=$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64
    echo $NDKROOT
    echo $TOOLCHAIN
    #--cc=$TOOLCHAIN/bin/aarch64-linux-android28-clang \
    #                --cxx=$TOOLCHAIN/bin/aarch64-linux-android28-clang++ \
    #                --nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \
    function build()
    {
    
        #--prefix:设置安装目录,重要
        #--enable-small:优化大小,重要
        #--target-os=android:不给不行,会做目标os辨别,然后if取相应的值,重要
        #--arm=aarch64: armv8-a需设置为aarch64,重要,可aarch64;arm
        #--sysroot:编译时指定了逻辑目录,重要
        #--cross-prefix:交织编译东西链,会做前缀<cross-prefix> + clang等路径拼接,重要,枚举:aarch64-linux-android-;arm-linux-androideabi-
        #--cc:clang编译工具的具体地址,可换成arm-linux-androideabi-,重要
        #--cxx:clang++编译工具的具体地址,可换成arm-linux-androideabi-,重要
        #--extra-ldflags=-L/usr/local/x264-x86/lib :是编译安装的x264模块,看需求
        #--extra-cflags="-Os fpic $ADDI_CFLAGS":会传给gcc的参数,重要
        #  fpic:生成与位置无关,详见:https://blog.csdn.net/a_ran/article/details/41943749
        #--enable-gpl 选择许可证,FFMPEG默认许可证LGPL 2.1,如果需要加gpl的库
        #  需要使用gpl的许可证,例如libx264就是gpl的,如果需要加入libx264则需要
        #  加上,详见:https://blog.csdn.net/ericbar/article/details/81079955
        #--enable-shared:生成动态库,默认不生成动态库
        #--disable-static:不生产静态库,默认生成静态库
        #--enable-pthreads:开启多线程编解码,注意不是php的pthreads,sysroot变量如果和cc、cxx不匹配,
        #  须指定双方都是$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64下的,否则会导致ERROR: pthreads requested but not found
        #--disable-ffmpeg:禁用ffmpeg命令行形式模块 <<可以参照ffmpeg交叉编译-1模块说明>>
        #--disable-ffplay:禁用ffplay模块 <<可以参照ffmpeg交叉编译-1模块说明>>
        #--disable-ffprobe:禁用多媒体码流分析器
        #--disable-ffserver:ffserver负责响应客户端的流媒体请求,把流媒体数据发送给客户端
        #--disable-avdevice : 关闭avdevice模块,此模块在android中无用
        #--disable-encoders:关闭所有编码器 (播放不需要编码)
        #--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 ),重要
         echo 123456 | sudo -S ./configure \
            --prefix=${PREFIX} \
            --enable-small \
            --disable-programs \
            --target-os=android \
            --arch=aarch64 \
            --sysroot=${SYSROOT} \
            --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
            --cc=$TOOLCHAIN/bin/aarch64-linux-android28-clang \
                    --cxx=$TOOLCHAIN/bin/aarch64-linux-android28-clang++ \
            --extra-ldflags="$ADDI_LDFLAGS" \
            --extra-cflags="$ADDI_CFLAGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
            --enable-gpl \
            --enable-shared \
            --disable-static \
            --enable-pthreads \
            --disable-ffmpeg \
            --disable-ffplay \
            --disable-ffprobe \
            --disable-encoders \
            --disable-avdevice \
            --enable-protocols \
            --enable-filters \
            --enable-cross-compile
    
    make clean
        
    #开启多核编译,编译速度快一些
    make -j6
    #生成目标.so和include头文件列表
    make install
    
    }
    
    CPU=arm64
    PREFIX=./android/$CPU
    #marm功能优于mthumb百分之10到15,mthumb兼容性更好,可以调试用marm,发版用mthumb ADDI_CFLAGS="-marm",可换成-march=arm
    ADDI_CFLAGS="-march=armv8-a"
    #-I/usr/local/include
    #ADDI_LDFLAGS="-L/usr/local/lib"
    build
    
    #执行脚本,可先把build中的make先注释掉,configure没有错误后再make安装,错
    #误信息会放在ffmbuild/config.log,可用xftp取出来查看最后报什么错,如果报xxxx.h
    #文件找不到等,基本也是configure配置里面有错误,需要逐一比对排查
    ./build.sh
    
    #编译结果在ffmpeg4.3/android下,
    cd ./android/arm64/
    [atguigu@hadoop01 arm64]$ tree ./ -L 2
    ./
    ├── include
    │   ├── libavcodec
    │   ├── libavfilter
    │   ├── libavformat
    │   ├── libavutil
    │   ├── libpostproc
    │   ├── libswresample
    │   └── libswscale
    ├── lib
    │   ├── libavcodec.so
    │   ├── libavfilter.so
    │   ├── libavformat.so
    │   ├── libavutil.so
    │   ├── libpostproc.so
    │   ├── libswresample.so
    │   ├── libswscale.so
    │   └── pkgconfig
    └── share
        └── ffmpeg
    
    

    可参考:
    Android 音视频学习系列:https://www.jianshu.com/p/1f89638e25c1
    FFmpeg 参数解析:https://blog.csdn.net/yzhang6_10/article/details/77104211
    编译 FFmpeg 之 clang:https://blog.csdn.net/qq_39756073/article/details/99837603

    相关文章

      网友评论

          本文标题:ffmpeg交叉编译-2ffmpeg编译参数

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