• FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)


    准备工作

    环境准备

    1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。

    坑一:无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04 无法实现拖放复制操作解决办法-CSDN博客

    下载文件

    下载ndk25

    官网下载:ndk官网
    网盘下载:android-ndk-r25c-linux.zip

    注意,这是linux环境下的ndk。

    下载FFmpeg 5.1.3

    官网下载:FFmpeg官网
    网盘下载:FFmpeg 5.1.3

    解压文件

    解压文件:

    1. #解压ffmpeg-5.1.3.tar.xz
    2. tar -xf ffmpeg-5.1.3.tar.xz
    3. #解压android-ndk-r25c-linux.zip
    4. unzip android-ndk-r25c-linux.zip

     ndk配置环境变量

    配置环境变量命令:sudo gedit ~/.bashrc   注意:替换为你的ndk路径

    1. export NDK_HOME=/你的ndk路径/android-ndk-r25c
    2. export PATH=$NDK_HOME:$PATH
    输入命令 ndk-build查看配置环境变量成功没,只要没出command not found就证明环境变量配置成功,如果成功显示如下,

    下载所需编译软件

    首先更新包列表:

    sudo apt update

    然后下载需要的编译软件

    1. sudo apt install autoconf \
    2. automake \
    3. build-essential \
    4. cmake \
    5. git-core \
    6. libass-dev \
    7. libfreetype6-dev \
    8. libgnutls28-dev \
    9. libmp3lame-dev \
    10. libsdl2-dev \
    11. libtool \
    12. libva-dev \
    13. libvdpau-dev \
    14. libvorbis-dev \
    15. libxcb1-dev \
    16. libxcb-shm0-dev \
    17. libxcb-xfixes0-dev \
    18. meson \
    19. ninja-build \
    20. pkg-config \
    21. texinfo \
    22. wget \
    23. yasm \
    24. zlib1g-dev \
    25. libunistring-dev \
    26. libaom-dev \
    27. libdav1d-dev \
    28. pkg-config

    配置root用户

    注意:编译的时候用root用户,我用普通用户编译失败

    普通用户登录成功后设置 root 用户的登录密码,然后 su 登录

    1. $ sudo passwd root
    2. [sudo] password for dummy: # 此处需输入普通用户的登录密码
    3. New password: # 此处输入 root 用户的登录密码(新设置密码)
    4. Retype new password: # 此处再次输入 root 用户的登录密码(确认与上面的密码输入一致)
    5. passwd: password updated successfully
    6. $ su
    7. Password: # 此处输入上面设置的 root 用户登录密码,回车即可登录至 root 用户
    8. # exit # 退出登录 root 用户,回到普通用户登录态

    到这一步编译所需的准备工作就做完了,接下来终于可以开始编译了。

     编译FFmpeg

    修改FFmpeg的configure文件,将文件中:

    1. SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    4. SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

    替换为:

    1. SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    4. SLIB_INSTALL_LINKS='$(SLIBNAME)'

    试运行configure文件:
    进入FFmpeg源码根目录下,使用

    sudo ./configure

    成功运行了,接下来就可以开始筹备针对安卓平台的编译了。

    在FFmpeg目录下新建build_android.sh,想了解详细配置参数请前往这里

    1. # touch 新建文件
    2. [root@CentOS6 ffmpeg-5.1.3]# touch build_android.sh
    3. # vim 编辑build_android.sh
    4. [root@CentOS6 ffmpeg-5.1.3]# vim build_android.sh

    写入脚本内容:

    1. #!/bin/bash
    2. #特别注意: 以下路径需要修改成自己Linux系统中的NDK目录!前面上传的ndk解压文件当中
    3. TOOLCHAIN=/usr/local/src/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64
    4. # 最低支持的android sdk版本
    5. API=21
    6. # --extra-cflags中添加'-DVK_ENABLE_BETA_EXTENSIONS=0', 防止引用vulkan_beta.h头文件
    7. function build_android
    8. {
    9. echo "Compiling FFmpeg for $CPU"
    10. ./configure \
    11. --prefix=$PREFIX \
    12. --disable-neon \
    13. --disable-hwaccels \
    14. --disable-gpl \
    15. --disable-postproc \
    16. --enable-shared \
    17. --enable-jni \
    18. --disable-mediacodec \
    19. --enable-small \
    20. --enable-gpl \
    21. --disable-decoder=h264_mediacodec \
    22. --disable-static \
    23. --disable-doc \
    24. --disable-programs \
    25. --disable-ffmpeg \
    26. --disable-ffplay \
    27. --disable-ffprobe \
    28. --disable-avdevice \
    29. --disable-symver \
    30. --cross-prefix=$CROSS_PREFIX \
    31. --target-os=android \
    32. --arch=$ARCH \
    33. --cpu=$CPU \
    34. --cc=$CC \
    35. --cxx=$CXX \
    36. --enable-cross-compile \
    37. --sysroot=$SYSROOT \
    38. --extra-cflags="-DVK_ENABLE_BETA_EXTENSIONS=0 -mno-stackrealign -Os -fpic $OPTIMIZE_CFLAGS" \
    39. --extra-ldflags="$ADDI_LDFLAGS" \
    40. $ADDITIONAL_CONFIGURE_FLAG
    41. make clean
    42. make -j4
    43. make install
    44. echo "The Compilation of FFmpeg for $CPU is completed"
    45. }
    46. #armv8-a
    47. ARCH=arm64
    48. CPU=armv8-a
    49. # r21版本的ndk中所有的编译器都在/toolchains/llvm/prebuilt/darwin-x86_64/目录下(clang)
    50. CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
    51. CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
    52. # NDK头文件环境
    53. SYSROOT=$TOOLCHAIN/sysroot
    54. CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
    55. # so输出路径
    56. PREFIX=$(pwd)/android/$CPU
    57. OPTIMIZE_CFLAGS="-march=$CPU"
    58. build_android
    59. # 交叉编译工具目录,对应关系如下
    60. # armv8a -> arm64 -> aarch64-linux-android-
    61. # armv7a -> arm -> arm-linux-androideabi-
    62. # x86 -> x86 -> i686-linux-android-
    63. # x86_64 -> x86_64 -> x86_64-linux-android-
    64. # CPU架构
    65. #armv7-a
    66. ARCH=arm
    67. CPU=armv7-a
    68. CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
    69. CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
    70. SYSROOT=$TOOLCHAIN/sysroot
    71. CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
    72. PREFIX=$(pwd)/android/$CPU
    73. OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
    74. build_android
    75. # #x86
    76. # ARCH=x86
    77. # CPU=x86
    78. # CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
    79. # CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
    80. # SYSROOT=$TOOLCHAIN/sysroot
    81. # CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
    82. # PREFIX=$(pwd)/android/$CPU
    83. # OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
    84. # build_android
    85. # #x86_64
    86. # ARCH=x86_64
    87. # CPU=x86-64
    88. # CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
    89. # CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
    90. # SYSROOT=$TOOLCHAIN/sysroot
    91. # CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
    92. # PREFIX=$(pwd)/android/$CPU
    93. # OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
    94. # 方法调用
    95. # build_android

    赋权限755

    在FFmpeg目录下的ffbuild目录中,将图中sh文件权限改为755,否则编译过程中可能报错无权限执行该文件。build_android.sh文件也赋权一下。

    chmod 755  build_android.sh
    
    • 执行脚本
    ./ build_android.sh

     编译成功,可以看到已经生成了.so动态库文件。

    坑二:最后强调:赋权限和执行build_android.sh  都使用root用户,我普通用户编了半天也不成功。

    参考连接:

    FFmpeg5.1.3编译动态库详细教程(基于Linux虚拟机)-CSDN博客

     【Android音视频开发】FFmpeg库编译详解(2022最新版)_android 编译ffmpeg_JesseAndroid的博客-CSDN博客

     【精选】ffmpeg编译参数详解_--disable-swscale-alpha-CSDN博客

  • 相关阅读:
    Solidity 小白教程:16. 函数重载
    解决HtmlUnit执行JS报错提示ScriptException
    西华大学计算机考研资料汇总
    Spring boot @ConditionalOnProperty 使用以及作用
    基于机器学习和深度学习的C-MAPSS涡扇发动机剩余寿命RUL预测(Python,Jupyter Notebook环境)
    十三、Mysql的存储引擎
    玩转gpgpu-sim 04记—— __cudaRegisterBinary() of gpgpu-sim 到底做了什么
    『 CSS实战』CSS3 实现一些好玩的效果(1)
    SpringAOP入门
    hive和hadoop版本对应关系
  • 原文地址:https://blog.csdn.net/dodod2012/article/details/134069692