一.FFmpeg简介
-
这里对FFmpeg只做个最简单的简介。
-
Ffmpeg是一个音视频处理的库。在使用MediaCodeC进行编码的时候,大量的手机是不支持B帧的编码。根据手机的官方的一些文档,小米10,高通655、885这些芯片是支持B帧的编码。一般的手机不支持B帧的编码,所以,如果要对视频进行压缩的话,最好是CPU通过使用FFmpeg来做。
-
FFmpeg用来做播放的话性能还是可以的,但是用来做编码,会时不时的发热一下。
二.交叉编译
- Linux环境即可(温馨提示:NDK和Ffmpeg下载的版本很大程度决定需要耗费多少精气神,成败挺需要运气,推荐参考的文章FFmpeg 开发(01):FFmpeg 编译和集成)
- 按照推荐文章的版本,再结合本人的笔记,推荐全程环境一致,命名方式一致。
1.环境
- Linxu系统(阿里云服务)
2.下载资源
- 使用xshell链接云服务器
- 这里直接给出命令了(分别是下载ffmpeg-4.2.2和ndk-r20b,本人是新建了opt文件夹,在该文件目录下执行下方命令)
- wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
- wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip
- 下载后解压命令(需要先安装解压命令)
- 解压命令:yum install unzip
- tar -xvf ffmpeg-4.2.2.tar.bz2
- unzip android-ndk-r20b-linux-x86_64.zip
3.配置NDK环境变量
-
NDK是有多个位置可以配置环境变量的,俺选择修改root下的.bashrc文件
-
执行命令:vim ~/.bashrc,添加如下信息(添加完成通过wq进行保存,需要对vim有一点点了解):
# 在文件末尾添加 ndk环境变量(/root/opt/android-ndk-r23根据pwd命令查看)
export NDKROOT=/root/opt/android-ndk-r20b
export PATH=$NDKROOT:$PATH
- 执行命令:source ~/.bashrc
- 接着通过ndk-build检测环境变量是否配置成功
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/root/opt/android-ndk-r20b/build/core/build-local.mk:151: *** Android NDK: Aborting . Stop.
4.修改configure文件[这次不需要]
5.编写编译脚本
- 如取名为build_android.sh,将一下内容复制进去即可,将文件放到ffmpeg-4.2.2目录中,或直接下载(交叉编译脚本)更方便使用
#!/bin/bash
export NDK=/root/opt/android-ndk-r20b #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-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 -j16
make install
echo "============================ build 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
#armv7-a
#ARCH=arm
#CPU=armv7-a
#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
#x86_64
#ARCH=x86_64
#CPU=x86-64
#CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
#SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
#CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
#PREFIX=$(pwd)/android/$CPU
#OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
#build_android
-
安装上传下载工具包(上传文件到云服务器)
- 命令:sudo yum install lrzsz
- 执行命令:rz,会出现上传文件的弹窗,将build_android.sh文件放入到ffmpeg-4.2.2目录下
-
设置编译脚本的权限
- 命令:chmod +x build_android.sh
6.测试交叉编译效果
-
执行命令:./build_android.sh
-
上一次折腾的时候,很多问题都处理了,这次就碰到一个问题,快速搜索之前的笔记进行处理,报错:-bash: ./build_android.sh: /bin/bash^M: bad interpreter: No,执行命令:sed -i “s/\r//” build_android.sh来转化
-
继续执行 ./build_android.sh 开始编译
-
查看效果
7.报错处理
7.1.报错一
-bash: ./build_android.sh: /bin/bash^M: bad interpreter: No such file or directory
- 处理方式
- 直接执行sed -i “s/\r//” build_android.sh来转化, 然后运行脚本
7.2.报错二
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build
- 处理方式
- 需要安装yasm的汇编编译器,执行命令:yum install yasm -y,然后重新执行编译脚本
7.3.报错三
./xxx.sh: line 2: $'\r': command not found
./xxx.sh: line 6: $'\r': command not found
./xxx.sh: line 8: syntax error near unexpected token `$'{\r''
'/xxx.sh: line 8: `{
- 处理方式
- 安装 dos2unix
- centos系统:yum install -y dos2unix
- ubuntu系统:apt-get -y install dos2unix
- 安装 dos2unix
三.总结
- 这是俺第5次处理交叉编译了,这次比较顺利,20分钟不到搞定。第一次处理是决定学习音视频的时候,距离现在已经有两年了。前面4次成功过2次(均是在linux虚拟机上操作的),失败过2次(云服务器环境),失败的主要原因是ffmpeg和ndk的版本没有选到合适的(俺总是想下载最新的去尝试,可结果总不理想,关于编译脚本的内部细节不用过于深究,具体的编译配置可以通过./configure --help来查看)。前面4次每次几乎都是整天的时间,各种尝试,一天下来,特别费神,这次俺的目标是交叉编译成功就行,不在乎版本高低的问题,结果比较快,文件处理等大概5分钟,编译大概10分钟。