Ffmpeg交叉编译

一.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

三.总结

  • 这是俺第5次处理交叉编译了,这次比较顺利,20分钟不到搞定。第一次处理是决定学习音视频的时候,距离现在已经有两年了。前面4次成功过2次(均是在linux虚拟机上操作的),失败过2次(云服务器环境),失败的主要原因是ffmpeg和ndk的版本没有选到合适的(俺总是想下载最新的去尝试,可结果总不理想,关于编译脚本的内部细节不用过于深究,具体的编译配置可以通过./configure --help来查看)。前面4次每次几乎都是整天的时间,各种尝试,一天下来,特别费神,这次俺的目标是交叉编译成功就行,不在乎版本高低的问题,结果比较快,文件处理等大概5分钟,编译大概10分钟。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值