Android Liunx ffmpeg交叉编译

        本文的交叉编译在window上安装VMware,使用Ubuntu20.4进行的编译。

一、安装NDK:

        1、下载解压:

        在NDK 下载  |  Android NDK  |  Android Developers下载Liunx平台的NDK。

        本人下载的是android-ndk-r27c-linux.zip版本的。

        解压android-ndk-r27c-linux.zip

    unzip android-ndk-r27c-linux.zip 

        在存放NDK的目录下解压 android-ndk-r27c-linux.zip:

        2、修改android-ndk-r27c-linux文件权限:      

sudo chmod 777 -R android-ndk-r27c

        3、NDK的环境变量的配置:

        编辑/etc/profile:

    sudo vim /etc/profile

        将NDK存放的路径加入到环境当中:

        路径为NDK存放的路径,可以cd到NDK文件夹下pwd后获取:

        之后配置如下环境变量: 

    #Android NDK
    export ANDROID_NDK=/home/wyy/Android/android-ndk-r27c
    export PATH=$PATH:$ANDROID_NDK

       在.bashrc的文件末尾加入3中获取的ndk路径,保存并退出:

     sudo gedit ~/.bashrc

        更新.bashrc配置:

    source ~/.bashrc

        验证NDK版本:

   ndk-build -v

       

二、下载解压FFmpeg:

        1、下载ffmpeg:

        通过ffmpeg的下载页面下载需要的ffmpeg的版本:Download FFmpeg

        本人下载的是:ffmpeg-5.1.6.tar.xz版本的

        2、解压ffmpeg:

        解压ffmpeg-5.1.6.tar.xz

    tar -xvf ffmpeg-5.1.6.tar.xz

        3、修改文件权限

sudo chmod 777 -R ffmpeg-5.1.6

三、创建编译脚本

         1、在ffmpeg的文件目录下运行./configure:

        会出现的错误提示: 

        如未安装yasm,则需要安装yasm:

        

       2、创建android_build1.sh编译脚本:

        在ffmpeg-5.1.6文件夹下创建android_build1.sh:

sudo gedit android_build1.sh

        输入如下脚本代码:

#!/bin/bash
# 用于编译android平台的脚本

# NDK所在目录
NDK_PATH=/home/wyy/Android/NDKS/android-ndk-r27c # tag1
# macOS 平台编译,其他平台看一下 $NDK_PATH/toolchains/llvm/prebuilt/ 下的文件夹名称
HOST_PLATFORM=linux-x86_64  #tag1
# minSdkVersion
API=23

TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 与位置无关的代码
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "
LDFLAG="-lc -lm -ldl -llog "

# 输出目录
PREFIX=`pwd`/android
# 日志输出目录
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=

build() {
  APP_ABI=$1
  echo "======== > Start build $APP_ABI"
  case ${APP_ABI} in
  armeabi-v7a)
    ARCH="arm"
    CPU="armv7-a"
    MARCH="armv7-a"
    TARGET=armv7a-linux-androideabi
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    # 交叉编译工具前缀
    CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"
    EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH "
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--enable-neon --cpu=$CPU "
    ;;
  arm64-v8a)
    ARCH="aarch64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    EXTRA_CFLAGS="$CFLAG"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS=""
    ;;
  x86)
    ARCH="x86"
    CPU="i686"
    MARCH="i686"
    TARGET=i686-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32"
    EXTRA_CFLAGS="$CFLAG -march=$MARCH  -mssse3 -mfpmath=sse -m32"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  x86_64)
    ARCH="x86_64"
    CPU="x86-64"
    MARCH="x86_64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"
    EXTRA_CFLAGS="$CFLAG -march=$CPU -msse4.2 -mpopcnt -m64"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  esac

  echo "-------- > Start clean workspace"
make clean

  echo "-------- > Start build configuration"
  CONFIGURATION="$COMMON_OPTIONS"
  CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"
  CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"
  CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"
  CONFIGURATION="$CONFIGURATION --arch=$ARCH"
  CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"
  CONFIGURATION="$CONFIGURATION --cc=$CC"
  CONFIGURATION="$CONFIGURATION --cxx=$CXX"
  CONFIGURATION="$CONFIGURATION --ld=$LD"
  # nm 和 strip
  CONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"
  CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"
  CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"

  echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"
  ./configure ${CONFIGURATION} \
  --extra-cflags="$EXTRA_CFLAGS" \
  --extra-ldflags="$EXTRA_LDFLAGS"

  echo "-------- > Start make $APP_ABI with -j1"
  make -j1

  echo "-------- > Start install $APP_ABI"
  make install
  echo "++++++++ > make and install $APP_ABI complete."

}

build_all() {
  #配置开源协议声明
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"
  #目标android平台
  COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"
  #取消默认的静态库
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"
  #开启交叉编译
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"
  #尽可能小
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"
  #不要命令(执行文件)
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"  # do not build command line programs
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"
  #启用
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-muxer=flv"
  #COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"
  echo "COMMON_OPTIONS=$COMMON_OPTIONS"
  echo "PREFIX=$PREFIX"
  echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"
  mkdir -p ${CONFIG_LOG_PATH}
  #build "armeabi-v7a"
  build "arm64-v8a"
  build "x86"
  build "x86_64"
}

echo "-------- Start --------"
build_all
echo "-------- End --------"

       

        3、运行android_build1.sh脚本:

sudo sh android_build1.sh 

        

        运行android_build1.sh可能会出现的错误: 

        如上代表系统中还未安装make工具,安装make工具即可:

        4、编译完成:

        经过一段时间的编译后,在android的文件夹下。编译完成的结果输出如下:

        

        include文件夹:

        包含编译目标平台的头文件信息。

        lib文件夹:

        包含编译目标平台的so库。

        

        log文件夹:

      包含编译目标平台编译时的log信息。

        pkgconfig文件夹:

        该文件包含了FFmpeg库的相关信息,如头文件路径、库文件路径等。

        

        share文件夹:

        包含文档和手册,帮助用户理解和使用FFmpeg。

        以上的资源文件可在下面连接可下载https://download.youkuaiyun.com/download/wangyongyao1989/91214032?spm=1001.2014.3001.5503

<think>好的,我需要帮助用户解决在Linux系统上下载并编译FFmpeg的问题。用户之前已经询问过如何为FFmpeg编译NVDEC支持,现在他们想要一个更通用的下载和编译指南。我需要结合用户提供的引用内容以及之前的回答来生成一个清晰的步骤指南。 首先,我需要回顾之前的回答。在之前的回复中,我详细说明了启用NVDEC支持的步骤,包括硬件和软件要求、依赖安装、编译参数配置等。现在用户需要一个更基础的编译指南,可能不需要特定于NVDEC的部分,但需要涵盖通用的下载和编译过程。 接下来,用户提供了几个引用内容,需要参考这些内容。引用1提到在Linux下通过包管理器安装FFmpeg,包括更新包列表、下载、编译和验证。引用2涉及交叉编译后的验证步骤,引用3和4提到了处理依赖如OpenCV和libfdk-aac的编译问题,引用5提到了环境变量的设置。这些内容需要整合到当前的指南中。 用户的需求是下载并编译FFmpeg,可能需要从源码编译以获得更多功能或特定版本。因此,步骤应包括安装依赖、下载源码、配置编译选项、编译和安装,以及验证。同时,需要注意依赖的安装,如libx264、libx265、libfdk-aac等,这些在引用4中有所提及。 我需要确保步骤清晰,分点说明,包括必要的命令和解释。同时,需要处理可能的常见问题,比如依赖项缺失或路径问题,引用3中的问题处理经验可能有用。另外,引用5中的环境变量设置可能需要包含在步骤中,尤其是在交叉编译或自定义安装路径时。 还需要考虑用户可能遇到的典型问题,比如如何验证安装是否成功,如何处理编译错误,如何添加额外的编解码器支持等。引用2中的验证方法(如使用file命令检查二进制文件)可以加入验证步骤。 最后,生成相关问题,帮助用户进一步探索,比如如何添加特定编解码器,如何进行交叉编译,如何处理依赖问题等,这些问题应基于引用内容和之前的讨论。 需要检查所有命令的正确性,确保使用正确的包管理器命令(如apt),正确的git克隆步骤,以及正确的配置参数。例如,引用4中的libfdk-aac编译步骤需要包含autoreconf和configure命令,这可能要整合到依赖安装部分。 总结来说,步骤应包括:安装依赖、获取源码、配置编译选项、编译和安装、验证安装、环境变量设置(如有必要)、常见问题处理。需要综合引用内容,确保覆盖用户可能需要的各个方面,同时保持结构清晰,易于跟随。</think>### Linux系统下FFmpeg下载与编译完整指南 --- #### 一、准备工作 1. **更新系统与安装基础工具** ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential git autoconf libtool pkg-config nasm yasm cmake ``` 2. **安装核心编解码器依赖** ```bash # H.264/H.265支持 sudo apt install libx264-dev libx265-dev # AAC音频支持(可选libfdk-aac) git clone --depth 1 https://github.com/mstorsjo/fdk-aac cd fdk-aac && autoreconf -fiv ./configure --prefix=/usr/local --enable-shared make -j$(nproc) && sudo make install ``` --- #### 二、获取FFmpeg源码 ```bash git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg git checkout release/5.1 # 选择稳定分支(可选) ``` --- #### 三、配置编译参数 ```bash ./configure \ --prefix=/usr/local/ffmpeg-custom \ # 自定义安装路径 --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-libfdk-aac \ --enable-nonfree \ --enable-shared \ # 生成动态链接 --extra-cflags="-I/usr/local/include" \ --extra-ldflags="-L/usr/local/lib" ``` **关键参数说明**: - `--enable-gpl`:启用GPL协议要求的组件(如x264/x265) - `--enable-nonfree`:允许非自由组件(如libfdk-aac) --- #### 四、编译与安装 ```bash make -j$(nproc) # 使用所有CPU核心加速编译 sudo make install # 安装到指定目录 # 添加环境变量(临时生效) export PATH="/usr/local/ffmpeg-custom/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/ffmpeg-custom/lib:$LD_LIBRARY_PATH" # 永久生效需将上述命令写入 ~/.bashrc 或 ~/.zshrc ``` --- #### 五、验证安装 1. **版本检查** ```bash ffmpeg -version | grep "configuration" # 查看启用的组件 ``` 2. **编解码器支持验证** ```bash ffmpeg -codecs | grep -E 'x264|x265|aac' # 应显示对应编码器 ``` 3. **二进制文件验证**(交叉编译场景参考[^2]) ```bash file /usr/local/ffmpeg-custom/bin/ffmpeg # 检查架构是否匹配 ``` --- #### 六、常见问题解决 1. **依赖缺失错误** - 现象:`error: libx264 not found` - 解决:确认已执行`sudo apt install libx264-dev`并检查`--extra-cflags`路径 2. **动态加载失败** - 现象:`error while loading shared libraries` - 解决:执行`sudo ldconfig`刷新缓存,或检查`LD_LIBRARY_PATH`设置[^5] 3. **OpenCV集成问题**(参考[^3]) - 若需与OpenCV配合使用,需确保FFmpeg版本与OpenCV要求的版本匹配 - 通过`git checkout -b n4.4.1`切换特定分支 --- #### 七、扩展功能定制 1. **添加NVIDIA硬件加速**(参考用户历史问题) 在configure参数中添加: ```bash --enable-cuda-nvcc --enable-nvdec --enable-cuvid ``` 2. **交叉编译到ARM架构**(参考[^2][^5]) ```bash ./configure --arch=aarch64 --cross-prefix=aarch64-linux-gnu- \ --sysroot=/opt/aarch64-rockchip-linux-gnu ``` --- ### 相关问题 1. 如何为FFmpeg添加VP9/AV1编码支持? 2. 如何在Ubuntu中完全卸载自定义编译的FFmpeg? 3. FFmpeg动态链接与静态链接编译有何区别? 4. 如何通过FFmpeg实现硬件加速视频转码? 5. 交叉编译时出现"architecture mismatch"错误如何解决? > 提示:若需长期维护多个FFmpeg版本,建议使用`update-alternatives`管理多版本切换[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值