众所众知,树莓派64位官方源里面的ffmpeg对硬件解码的支持非常蛋疼

但是在树莓派上编译ffmpeg非常消耗资源和时间,而且要下载2Gb的依赖库,对于我这种有洁癖的人来说太痛苦了

那么我们可以在性能更加强劲Linux服务器上进行编译

这个教程是使用QEMU用户模式模拟一个树莓派的环境来编译,并非直接在Linux宿主进交叉编译。交叉编译要自己配置头文件太令人头疼

首先。下载到树莓派的64位系统的镜像,可以点击这里进入下载页面

从11月8日开始的镜像,树莓派官方已经换用了bullseye发行版,由于底层库版本的问题,会出现奇怪的兼容性问题。如果您的系统为buster,请使用11月8日前的镜像进行编译

推荐在境外服务器进行编译,国内由于网络问题非常蛋疼

宿主机的环境配置

宿主机运行下面的命令,安装需要的工具

sudo apt install qemu-user-static systemd-container

这里假设你已经下载并且解压好了树莓派的镜像文件,接下来我们需要解压出里面的RootFS使用,这里我使用2021-10-30-raspios-bullseye-arm64.img作为演示

请使用ROOT用户执行下面的操作

#绑定镜像到环回设备
#挑选一个loop回环设备,这里以loop0为例子
losetup -P /dev/loop0 2021-10-30-raspios-bullseye-arm64.img

mkdir rpi-env rpi-env-mount

#只读挂载树莓派的镜像
mount -o ro /dev/loop0p2 rpi-env-mount
#这里必须使用mv来代替复制,如果使用cp命令会丢失文件的suid导致sudo等功能报废
#mv rpi-env-mount/* rpi-env/ 2> /dev/null
#当然也可以用cp -a来保留特殊属性,我上面那个奇怪的方法还是弃用吧
cp -ar rpi-env-mount/* rpi-env/

#卸载和解绑环回设备
umount rpi-env-mount
rmdir rpi-env-mount
losetup -d /dev/loop0
#到了这里,镜像已经解压完毕,您可以随意删除img文件,后续就不需要该文件了

现在您可以使用下面的命令进入容器

#可以使用快捷键ctrl+a+d暂时离开
#可以使用命令screen -r build重新回到控制台
screen -S build systemd-nspawn -D rpi-env --hostname=raspberrypi --user=pi

容器的环境配置

以下所有命令如果没有特别说明,都必须只能在容器内执行,请勿在宿主机执行下面的命令

安装编译所需的依赖库

sudo apt update
sudo apt -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libsdl2-dev libtool libva-dev libvorbis-dev meson ninja-build pkg-config texinfo wget yasm zlib1g-dev nasm libaom-dev libmp3lame-dev libopus-dev libx264-dev libvpx-dev libavfilter-dev libfdk-aac-dev libx265-dev

下载FFMPEG的源代码

我这里使用的是4.4版的源代码,可以点击这里浏览所有版本,带snapshot字样的是快照版,我个人不太推荐使用

wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz
tar xJf ffmpeg-4.4.tar.xz
cd ffmpeg-4.4

接下来环境就配置完毕了,可以开始编译了

开始编译

#配置编译选项
#注意这里回车没有任何提示,不要以为是软件卡了,需要等很久,不报错就行
./configure --prefix="./output" \
  --enable-gpl \
  --enable-gnutls \
  --enable-libaom \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree
#除非你对你的vps非常自信,否则不要-j4,因为arm的转译也是非常消耗资源的
make -j4
make install
#编译完成,生成的文件在现在的output目录里

食用方法

您在使用硬件加速的时侯可能会遇到如下错误

Unknown decoder 'h264_omx'

那是因为我们在上面的配置环节根本没开启omx支持,就算开启了也会有如下报错

No such File 'libOpenMax_Core.so'

这个github有大佬已经给出了答案,引用原话就是OMX本来就不支持64位系统,所以64位的系统不能通过OMX接口访问硬件加速

解决方法就是修改命令,使用h264_v4l2m2m解码器,也能调用硬件加速,示例如下

ffmpeg -i example.mp4 -acodec copy -vcodec h264_v4l2m2m out.example.mp4

我是伸手党,我懒得自己编译

点击这里下载我自己预编译的版本(tar.xz格式)

参考资料

原教程: 【树莓派排坑指南】如何为你64位系统的树莓派4B编译可使用硬件编码的FFMPEG-哔哩哔哩

github一位大佬的回答:https://github.com/raspberrypi/Raspberry-Pi-OS-64bit/issues/98#issuecomment-715321951

更新记录

  • 2022年1月17日追加更新:使用方法