Fmpeg 有六个常用的功能模块:
- libavformat:多媒体文件或协议的封装和解封装库,如 Mp4、Flv 等文件封装格式,RTMP、RTSP 等网络协议封装格式;
- libavcodec:音视频编解码库;
- libavfilter:音视频、字幕滤镜库;
- libswscale:图像格式转换库;
- libswresample:音频重采样库;
- libavutil:工具库;
编译准备:
- center os 服务器
- 下载FFmpeg 4.3.1
- 下载android-ndk-r20b-linux-x86_64, 设置环境变量
手动搭建FTP站点(CentOS 8)
https://help.aliyun.com/document_detail/182263.html?spm=a2c4g.11186623.6.1232.fdf02ffbzrs5lB
环境
- 下载ffmpeg文件(linux下载不下来 我本地下载上传到github 在clone下来的)
https://gitee.com/liudao/AudioRecodeDemo.git
git clone https://gitee.com/liudao/AudioRecodeDemo.git
- 解压
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