• android NDK交叉编译ffmpeg方法


    一,下载android NDK

    从android官网下载NDK。下载地址:

    NDK 下载  |  Android NDK  |  Android Developers (google.cn)

    本例android-ndk-r20b下载地址:

    https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip?hl=zh-cn

    下载后解压到linux环境,如目录:

    /home/user/android-ndk-r20b

    记得配置执行权限:

    1. cd /home/user/android-ndk-r20b
    2. chmod +x  ./android-ndk-r20b -R

    二,下载FFmpeg

    可以从github下载:https://github.com/FFmpeg/FFmpeg

    下载后解压到linux环境,如目录:

    1. /home/user/ffmpeg20220808
    2. chmod +x  ./ffmpeg20220808 -R

    三,编写交叉编译脚本

    新建一个build_android_arm64.sh,内如复制粘贴用于arm64交叉编译脚本。放在目录

    /home/user/ffmpeg20220808,记得

    chmod+x build_android_arm64.sh

    1. #!/bin/bash
    2. ############ndk dir ##################
    3. export NDK=/home/user/android-ndk-r20b
    4. TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
    5. function build_android
    6. {
    7. ./configure \
    8. --prefix=$PREFIX \
    9. --enable-neon \
    10. --enable-hwaccels \
    11. --enable-gpl \
    12. --disable-postproc \
    13. --disable-debug \
    14. --enable-small \
    15. --enable-jni \
    16. --enable-mediacodec \
    17. --enable-decoder=h264_mediacodec \
    18. --enable-static \
    19. --enable-shared \
    20. --disable-doc \
    21. --enable-ffmpeg \
    22. --disable-ffplay \
    23. --enable-ffprobe \
    24. --disable-avdevice \
    25. --disable-doc \
    26. --disable-symver \
    27. --cross-prefix=$CROSS_PREFIX \
    28. --target-os=android \
    29. --arch=$ARCH \
    30. --cpu=$CPU \
    31. --cc=$CC \
    32. --cxx=$CXX \
    33. --enable-cross-compile \
    34. --sysroot=$SYSROOT \
    35. --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    36. --extra-ldflags="$ADDI_LDFLAGS"
    37. make clean
    38. make -j16
    39. make install
    40. echo "====== build android arm64 success ====== "
    41. }
    42. ######################### reserved for armv7-a ########################################
    43. #ARCH=arm
    44. #CPU=armv7-a
    45. #API=29
    46. #CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
    47. #CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
    48. #SYSROOT=$TOOLCHAIN/sysroot
    49. #CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
    50. #PREFIX=./out/target/$ARCH
    51. #OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
    52. #arm64-v8a
    53. ARCH=arm64
    54. CPU=armv8-a
    55. #android 10
    56. API=29
    57. CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
    58. CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
    59. SYSROOT=$TOOLCHAIN/sysroot
    60. CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
    61. PREFIX=./out/target/$ARCH
    62. OPTIMIZE_CFLAGS="-march=$CPU"
    63. #start build
    64. build_android

    新建一个build_android_arm.sh,内如复制粘贴下面armv7的交叉编译脚本。放在目录

    /home/user/ffmpeg20220808,记得

    chmod+x build_android_arm.sh

    1. #!/bin/bash
    2. ###############ndk dir ##################
    3. export NDK=/home/user/android-ndk-r20b
    4. TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
    5. function build_android
    6. {
    7. ./configure \
    8. --prefix=$PREFIX \
    9. --enable-neon \
    10. --enable-hwaccels \
    11. --enable-gpl \
    12. --disable-postproc \
    13. --disable-debug \
    14. --enable-small \
    15. --enable-jni \
    16. --enable-mediacodec \
    17. --enable-decoder=h264_mediacodec \
    18. --enable-static \
    19. --enable-shared \
    20. --disable-doc \
    21. --enable-ffmpeg \
    22. --disable-ffplay \
    23. --enable-ffprobe \
    24. --disable-avdevice \
    25. --disable-doc \
    26. --disable-symver \
    27. --cross-prefix=$CROSS_PREFIX \
    28. --target-os=android \
    29. --arch=$ARCH \
    30. --cpu=$CPU \
    31. --cc=$CC \
    32. --cxx=$CXX \
    33. --enable-cross-compile \
    34. --sysroot=$SYSROOT \
    35. --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    36. --extra-ldflags="$ADDI_LDFLAGS"
    37. make clean
    38. make -j16
    39. make install
    40. echo "====== build android arm64 success ====== "
    41. }
    42. ######################### reserved for armv7-a ########################################
    43. ARCH=arm
    44. CPU=armv7-a
    45. API=29
    46. CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
    47. CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
    48. SYSROOT=$TOOLCHAIN/sysroot
    49. CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
    50. PREFIX=./out/target/$ARCH
    51. OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
    52. #start build
    53. build_android

    注意,以上两个.sh 一定要修改 export NDK=/home/user/android-ndk-r20b到你自己的ndk目录。

    另外,如果编译android 11等对应的android版本,可以修改API=30.

    四,开始编译

    在/home/user/ffmpeg20220808目录,运行两个脚本即可交叉编译:

    1. ./build_android_arm.sh
    2. ./build_android_arm64.sh

    有其他配置修改,在函数 function build_android{}里面修改。编译产物在out/文件夹下。ffmpeg与ffprobe可执行文件,在当前目录。

    五,验证

    把编译后的与编译脚本.sh同级目录的 ffmpeg 通过adb push 到手机系统中:

    1. adb remount
    2. adb push ffmpeg /vendor/bin
    3. adb push ffprobe /vendor/bin

    把编译后的out/target/arm64/lib目录的全部so, 通过adb push 到手机文件系统/vendor/lib64中:

    adb push Z:\ffmpeg20220808\out\target\arm64\lib\libavcodec.so Z:\ffmpeg20220808\out\target\arm64\lib\libavformat.so Z:\ffmpeg20220808\out\target\arm64\lib\libavfilter.so Z:\ffmpeg20220808\out\target\arm64\lib\libavutil.so Z:\ffmpeg20220808\out\target\arm64\lib\libpostproc.so Z:\ffmpeg20220808\out\target\arm64\lib\libswscale.so /vendor/lib64
    

    可以在adb shell里面敲命令验证一下:

    1. adb shell
    2. ffmpeg -i /sdcard/111.mp4
    3. ffprobe /sdcard/Dolls.mp4

    六,编译静态可执行FFmpeg方法

    由于编译动态加载的SO,可能跟项目其他版本的FFmpeg编译的so冲突,则可以修改configure来把so编译到bin一起。

    function build_android() 删掉:

    --enable-shared \

    function build_android() 添加: 

    1. --pkg-config-flags="--static" \
    2. --disable-shared \ 

  • 相关阅读:
    Android进阶:5、发送post请求、json数据格式以及okhttp框架的使用
    Android Material Design之BottomAppBar(八)
    关于建立开放的学术论文共享平台的倡议
    Unable to find GatewayFilterFactory with name TokenRelay
    GIT 工具使用
    freertos之临界区管理
    失效的访问控制及漏洞复现
    【星戈瑞】FITC-PEG-N3在抗体标记中的应用
    零数科技受邀为常州高新区进行产业区块链培训
    汽车R155法规包含那些国家?
  • 原文地址:https://blog.csdn.net/suixin______/article/details/126229302