Ubuntu 编译ffmpeg so动态库

一、编译的环境

  1. Ubuntu20.04.3 + NDK-r22版本 + Cmake 3.18.1版本 + ffmpeg-4.0.6
  2. Ubuntu20.04.3系统,是用VirtualBox安装的。
  3. VirtualBox百度就可以免费下载。
  4. Ubuntu20.04.3系统可以到,华为OS镜像免费下载:https://mirrors.huaweicloud.com/
  5. 不会用VirtualBox安装Ubuntu的自己百度。

二、NDK下载

  1. 下载目录(自己的就行):/home/lven/tool/
  2. 下载地址:wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip
    备用版本:wget https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
    备用版本:wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip
    备用版本:wget https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip
  3. 解压:unzip android-ndk-r22-linux-x86_64.zip

三、Cmake 3.18.1安装

  1. 下载目录(自己的就行):/home/lven/tool/
  2. 下载地址:wget https://github.com/Kitware/CMake/releases/download/v3.18.1/cmake-3.18.1-Linux-x86_64.tar.gz
  3. 解压:tar zxvf cmake-3.18.1-Linux-x86_64.tar.gz
  4. 配置软连接:ln -sf /home/lven/tool/cmake-3.18.1-Linux-x86_64/bin/* /usr/bin/

四、ffmpeg下载(下载目录自己定)

  1. ffmpeg所有下载地址:http://ffmpeg.org/releases 自己找到想编译的版本
  2. ffmpeg-4.0.6下载地址:wget http://ffmpeg.org/releases/ffmpeg-4.0.6.tar.bz2
  3. 解压:tar zxvf ffmpeg-4.0.6.tar.bz2
  4. cd到ffmpeg-4.0.6目录下创建编译解本 affmpegv7a.sh和affmpegv8a.sh
  5. 执行解本:sudo sh affmpegv7a.sh 或者 sudo sh affmpegv8a.sh

五、affmpegv7a.sh编译脚本

#!/bin/bash
## NDK路径,换成自己的路径,就改这里就行了,其它的看自己需求
NDK=/home/lven/tool/android-ndk-r22
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
## 输出路径
PRFIX="$(pwd)/android/armeabi-v7a"
ARCH=arm
CPU=armv7-a
V7ABI=armv7a-linux-androideabi
CC=$TOOLCHAIN/bin/$V7ABI$API-clang
CXX=$TOOLCHAIN/bin/$V7ABI$API-clang++
ARMABI=arm-linux-androideabi
CROSS_PREFIX=$TOOLCHAIN/bin/$ARMABI-
# --disable-indev=v4l2 # error
./configure \
    --disable-asm \
    --disable-programs \
    --enable-shared \
    --disable-static \
    --enable-cross-compile \
    --target-os=android \
    --extra-cflags="-Os -fpic -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD" \
    --prefix=$PRFIX \
    --arch=$ARCH \
    --cpu=$CPU \
    --sysroot=$SYSROOT \
    --cross-prefix=$CROSS_PREFIX \
    --cc=$CC \
    --cxx=$CXX

    make clean
    make -j8
    make install
  • --extra-cflags="-Os -fpic -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD" 解决错误:libavdevice/v4l2.c:135:9: error: assigning to 'int (*)
  • CROSS_PREFIX得用arm-linux-androideabi-

六、affmpegv8a.sh编译脚本

#!/bin/bash
## NDK路径,换成自己的路径,就改这里就行了,其它的看自己需求
NDK=/home/lven/tool/android-ndk-r22
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
## 输出路径
PRFIX="$(pwd)/android/arm64-v8a"
ARCH=arm64
CPU=armv8a
V8ABI=aarch64-linux-android
CC=$TOOLCHAIN/bin/$V8ABI$API-clang
CXX=$TOOLCHAIN/bin/$V8ABI$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/$V8ABI-
# --disable-indev=v4l2 # error
./configure \
    --disable-asm \
    --disable-programs \
    --enable-shared \
    --disable-static \
    --enable-cross-compile \
    --target-os=android \
    --extra-cflags="-Os -fpic -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD" \
    --prefix=$PRFIX \
    --arch=$ARCH \
    --cpu=$CPU \
    --sysroot=$SYSROOT \
    --cross-prefix=$CROSS_PREFIX \
    --cc=$CC \
    --cxx=$CXX

    make clean
    make -j8
    make install
  • 仔细看$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/bin下的编译工具类。

七、总结

  1. 本人就编译v7a和v8a版本,目前用v7a就够了。
  2. 编译时遇到很坑,上面解本是本人编译成功的解本,如果你编译不成功也正常。

你可能感兴趣的:(Ubuntu 编译ffmpeg so动态库)