• [Android音视频]MacOS上FFmpeg5.0.1编译


    1. FFmpeg官网下载链接(推荐下载release的版本):Download FFmpegicon-default.png?t=M5H6http://ffmpeg.org/download.html#releases

    2. 下载压缩包,解压至自己想要的文件路径下即可。个人习惯用全英文路径,避免出现奇怪的问题。

    3. Android Studio请预先下载好。点击AS右上角“SDK Manager”--“SDK Tools”,可在列表中找到ndk,不同版本的AS有默认的NDK版本,详见以下指导文章:

    安装及配置 NDK 和 CMake  |  Android 开发者  |  Android Developers (google.cn)icon-default.png?t=M5H6https://developer.android.google.cn/studio/projects/install-ndk#apply-specific-versionAndroid Gradle 插件版本说明  |  Android 开发者  |  Android Developers (google.cn)icon-default.png?t=M5H6https://developer.android.google.cn/studio/releases/gradle-plugin#compatibility-7-1-04. 同理,点击右上角“SDK Manager”--“SDK Tools”,可在列表中找到CMake,比如3.10.2版本。

    5. 配置环境变量。在用户目录下创建配置文件( .bash_profile )。打开你的shell工具,执行:

    1. cd ~
    2. touch .bash_profile
    3. open -e .bash_profile

    在编辑器中写入Android NDK路径等(请修改下述路径为你机器上的目标路径): 

    1. export PATH=${PATH}:/Users/tao/Library/Android/sdk/tools
    2. export PATH=${PATH}:/Users/tao/Library/Android/sdk/platform-tools
    3. export NDK_ROOT=/Users/tao/Library/Android/sdk/ndk/21.4.7075529
    4. export PATH=${PATH}:${NDK_ROOT}

    写完后保存并关闭该文件。执行更新环境变量命令:

    source .bash_profile

    可以使用 env 查看当前的所有环境变量。若不小心把路径写错了,则重新执行上述编辑、保存、更新等操作即可。

    6. 修改FFmpeg文件夹下的configure文件。使用VS Code或者其它编辑软件打开configure文件。将以下代码进行修改:

    1. # origin code.
    2. # SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    3. # LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    4. # SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    5. # SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    6. # added by tao.
    7. SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    8. LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    9. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    10. SLIB_INSTALL_LINKS='$(SLIBNAME)'

    7. 请确定你要想要运行的目标Android设备的平台,例如 arm64-v8a。可使用以下命令获取你的Android设备的平台版本:

    adb shell getprop ro.product.cpu.abi

    8. 在该FFmpeg文件夹下创建编译脚本,可参考以下脚本(文件名自定义即可,例如 build_android.sh),请自行修改相应的参数(本人使用的测试设备是Redmi7,为arm64-v8a):

    1. #!/bin/bash
    2. NDK=/Users/tao/Library/Android/sdk/ndk/21.4.7075529
    3. TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
    4. API=28
    5. # 编译动态库:
    6. # enable-shared
    7. # disable-static
    8. # 编译静态库:
    9. # disable-shared
    10. # enable-static
    11. make clean
    12. function build_android
    13. {
    14. echo "Compile FFmpeg for $CPU start"
    15. ./configure \
    16. --prefix=$PREFIX \
    17. --disable-postproc \
    18. --disable-debug \
    19. --disable-doc \
    20. --disable-ffmpeg \
    21. --disable-ffplay \
    22. --disable-ffprobe \
    23. --disable-symver \
    24. --disable-doc \
    25. --disable-avdevice \
    26. --disable-static \
    27. --enable-shared \
    28. --enable-neon \
    29. --enable-hwaccels \
    30. --enable-jni \
    31. --enable-mediacodec \
    32. --enable-decoder=h264_mediacodec \
    33. --enable-decoder=hevc_mediacodec \
    34. --enable-decoder=mpeg4_mediacodec \
    35. --enable-hwaccel=h264_mediacodec \
    36. --cross-prefix=$CROSS_PREFIX \
    37. --target-os=android \
    38. --arch=$ARCH \
    39. --cpu=$CPU \
    40. --cc=$CC \
    41. --cxx=$CXX \
    42. --enable-cross-compile \
    43. --sysroot=$SYSROOT \
    44. --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    45. --extra-ldflags="$ADDI_LDFLAGS"
    46. make clean
    47. make -j16
    48. make install
    49. echo "The Compilation of FFmpeg for $CPU is completed"
    50. }
    51. # note:
    52. # Redmi7(arm64-v8a)
    53. #armv8-a
    54. ARCH=arm64
    55. CPU=armv8-a
    56. CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
    57. CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
    58. SYSROOT=$TOOLCHAIN/sysroot
    59. CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
    60. PREFIX=$(pwd)/android/$CPU
    61. OPTIMIZE_CFLAGS="-march=$CPU"
    62. build_android
    63. # 交叉编译工具目录,对应关系如下
    64. # armv8a -> arm64 -> aarch64-linux-android-
    65. # armv7a -> arm -> arm-linux-androideabi-
    66. # x86 -> x86 -> i686-linux-android-
    67. # x86_64 -> x86_64 -> x86_64-linux-android-

    9. 开始编译FFmpeg。执行(本人将该文件名命名为 build_android.sh):

    ./build_android.sh

    10. 编译完成后,可在该FFmpeg文件夹下看到 android 文件夹(这是由步骤7中的 PREFIX 参数中定义的)。进入该文件夹,可以看到在 armv8-a 文件夹下有多个文件夹。include 文件夹下为头文件,lib 文件夹下为库(步骤7中编译的是动态库,即so库,若你想编译静态库,可自行修改脚本并重新编译)。


    至此,编译完成。

  • 相关阅读:
    C++类构造函数和析构函数
    R语言使用MASS包的polr函数构建有序多分类logistic回归模型、使用VGAM包的vglm函数对有序多分类logistic回归模型进行平行性假设作检验
    按位与最大的最长连续子数组
    刻字机尖角补偿
    38、jenkins持续集成(一)
    Android Audio音频框架 <一>
    redis-cli客户端中获取数据中文显示xe问题
    甘露糖-阿霉素mannose-Doxorubicin|甘露糖-聚乙二醇-阿霉素,Doxorubicin-PEG-mannose
    【Electron+Vue】Error: error:0308010C:digital envelope routines::unsupported
    DBCO-PEG-Insulin|二苯并环辛炔-聚乙二醇-胰岛素|DBCO-PEG-胰岛素
  • 原文地址:https://blog.csdn.net/Taozi825232603/article/details/125436513