FFmpeg 4.3.1编译,以及编译配置解析.

本文详细介绍如何在Android平台上编译FFmpeg,包括环境搭建、配置脚本编写及关键参数解析等内容,帮助开发者快速掌握FFmpeg的交叉编译流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fmpeg 有六个常用的功能模块:

  • libavformat:多媒体文件或协议的封装和解封装库,如 Mp4、Flv 等文件封装格式,RTMP、RTSP 等网络协议封装格式;
  • libavcodec:音视频编解码库;
  • libavfilter:音视频、字幕滤镜库;
  • libswscale:图像格式转换库;
  • libswresample:音频重采样库;
  • libavutil:工具库;

编译准备:

  1. center os 服务器
  2. 下载FFmpeg 4.3.1
  3. 下载android-ndk-r20b-linux-x86_64, 设置环境变量

手动搭建FTP站点(CentOS 8)

https://help.aliyun.com/document_detail/182263.html?spm=a2c4g.11186623.6.1232.fdf02ffbzrs5lB

环境

  1. 下载ffmpeg文件(linux下载不下来 我本地下载上传到github 在clone下来的)
https://gitee.com/liudao/AudioRecodeDemo.git

git clone https://gitee.com/liudao/AudioRecodeDemo.git

  1. 解压
tar -jxvf ffmpeg-4.3.1.tar.bz2

tar解压bz2包–tar (child): bzip2:无法 exec: 没有那个文件或目录

原因:缺少bzip2包

yum install -y bzip2

配置项目

./configure --disable-x86asm

ndk配置

创建目录

在usr目录下创建 android文件夹

mkdir android

下载NDK

这个是r20b 的下载地址.

https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip

解压

unzip android-ndk-r20b-linux-x86_64.zip

安装unzip

yum install -y unzip zip

路径

/usr/android/ndk/android-ndk-r20b

FFmpeg 4.3.1 解压目录下创建编译脚本 build_android_arm64-v8a_clang.sh

vim build_android_arm64-v8a_clang.sh

修改ffmpeg配置文件

1、添加–cross-prefix-clang

--cross-prefix=PREFIX  use PREFIX for compilation tools [$cross_prefix]
  # 这里添加
--cross-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]
--progs-suffix=SUFFIX  program name suffix []

2、CMDLINE_SET 新增变量

CMDLINE_SET="
    $PATHS_LIST
    ar
    arch
    as
    assert_level
    build_suffix
    cc
    objcc
    cpu
    cross_prefix
    # 这里增加
    cross_prefix_clang
    custom_allocator
    cxx
    dep_cc
    doxygen
    env

3、修改 clang++ 编译的默认值

set_default target_os
if test "$target_os" = android; then
    cc_default="clang"
    # 这里新增
    cxx_default="clang++"
fi
 
ar_default="${cross_prefix}${ar_default}"
# 这里新增
cc_default="${cross_prefix_clang}${cc_default}"
# 这里新增
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
if ${cross_prefix}${ranlib_default} 2>&1 | grep -q "\-D "; then
    ranlib_default="${cross_prefix}${ranlib_default} -D"
else
    ranlib_default="${cross_prefix}${ranlib_default}"
fi

编译脚本1 arm_v7

#!/bin/bash
NDK=/usr/dev/ndk/android-ndk-r20b

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --enable-neon \
    --enable-hwaccels \
    --enable-gpl \
    --enable-postproc \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --disable-static \
    --disable-doc \
    --enable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
	--cc=$CC \
	--cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed 编译成功"
}

#armv7-a
ARCH=arm
CPU=armv7-a
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot	
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

编译脚本2

#!/bin/bash

#这里配置先你的 NDK 路径
export NDK=/usr/android/android-ndk-r20b 
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64


function build_android
{

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--enable-postproc \
--disable-debug \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"

make clean
make -j4
make install

echo "============================ build android arm64-v8a success =========================="

}

#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"

build_android

执行脚本

# 修改 build_android_arm64-v8a_clang.sh 可执行权限
chmod +x build_android_arm64-v8a_clang.sh
# 运行编译脚本
./build_android_arm64-v8a_clang.sh


运行后效果:

解析:

    --prefix=$PREFIX \  文件输出位置
    --enable-neon \    NEON优化
    --enable-hwaccels \  全部的硬件加速
    --enable-gpl \  允许使用GPL
    --enable-postproc \  postproc用于后期效果处理
    --enable-shared \  启用共享库
    --enable-jni \   启用JNI支持
    --enable-mediacodec \  启用安卓MediaCodec支持
    --enable-decoder=h264_mediacodec \  启用指定的解码器 h264
    --disable-static \  禁止静态库
    --disable-doc \  禁止生成doc文件
    --enable-ffmpeg \
    --disable-ffplay \  ffplay播放器
    --disable-ffprobe \
    --enable-small    使用--enable-small选项。能减掉大约3M的体积,从5M到大概1.94M(ffmpeg 1.0). 对于--enable-small,这个优化其实是牺牲编码解码速度来换取动态库的瘦身,对于硬盘或者内存不是那么紧迫的应用,完全可以不打开。
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \ 指定处理器
	--cc=$CC \
	--cxx=$CXX \
    --enable-cross-compile \ 使能交叉编译
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    
    
    make -j16  用于加速编译的参数
    --extra-cflags  用于编译的时候指定第三方库位置.
    -mfloat-abi=softfp -mfpu=vfp -marm  
    “soft”选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。
    “softfp”选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中
    “hard”选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。
    用-mfloat-abi=soft编译的app或者库,在用-mfloat-abi=softfp编译的OS中是可以跑的;
    用-mfloat-abi=softfp编译的app或者库,在用-mfloat-abi=soft编译的OS中,如果SoC中没有FPU,那么是不能跑的。
    而-mfloat-abi=softfp/soft与-mfloat-abi=hard,是互不兼容的。
    
    
--disable-avdevice       disable libavdevice build  == 模块之一(可以操控我们的摄像头-(Android中是不支持))
  --disable-avcodec        disable libavcodec build == audio video codec(编码 和 解码)
  --disable-avformat       disable libavformat build == 音视频格式生成和解析相关
  --disable-swresample     disable libswresample build == 音频 重采样(如果想把单声道,变成双声道)
  --disable-swscale        disable libswscale build == 对视频显示相关(对视频的缩放,放大 缩小)
  --disable-postproc       disable libpostproc build == 后期处理,很少用,可以关闭掉
  --disable-avfilter       disable libavfilter build == 给视频加水印,加字幕,特殊效果

其他参数解析文章参数解析

https://juejin.cn/post/6844904052807958536

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值