一.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_arm64-v8a_clang.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 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
-
安装上传下载工具包(上传文件到云服务器)
- 命令:sudo yum install lrzsz
- 执行命令:rz,会出现上传文件的弹窗,将build_android_arm64-v8a_clang.sh文件放入到ffmpeg-4.2.2目录下
-
设置编译脚本的权限
- 命令:chmod +x build_android_arm64-v8a_clang.sh
6.测试交叉编译效果
-
执行命令:./build_android_arm64-v8a_clang.sh
-
上一次折腾的时候,很多问题都处理了,这次就碰到一个问题,快速搜索之前的笔记进行处理,报错:-bash: ./build_android_arm64-v8a_clang.sh: /bin/bash^M: bad interpreter: No,执行命令:sed -i “s/\r//” build_android_arm64-v8a_clang.sh来转化
-
继续执行 ./build_android_arm64-v8a_clang.sh 开始编译
-
查看效果
7.报错处理
7.1.报错一
-bash: ./build_android_arm64-v8a_clang.sh: /bin/bash^M: bad interpreter: No such file or directory
- 处理方式
- 直接执行sed -i “s/\r//” build_android_arm64-v8a_clang.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的版本没有选到合适的(俺总是想下载最新的去尝试,可结果总不理想)。前面4次每次几乎都是整天的时间,各种尝试,一天下来,特别费神,这次俺的目标是交叉编译成功就行,不在乎版本高低的问题,结果比较快,文件处理等大概5分钟,编译大概10分钟。