众所众知,树莓派64位官方源里面的ffmpeg对硬件解码的支持非常蛋疼
但是在树莓派上编译ffmpeg非常消耗资源和时间,而且要下载2Gb的依赖库,对于我这种有洁癖的人来说太痛苦了
那么我们可以在性能更加强劲Linux服务器上进行编译
这个教程是使用QEMU用户模式模拟一个树莓派的环境来编译,并非直接在Linux宿主进交叉编译。交叉编译要自己配置头文件太令人头疼
首先。下载到树莓派的64位系统的镜像,可以点击这里进入下载页面
推荐在境外服务器进行编译,国内由于网络问题非常蛋疼
宿主机的环境配置
在宿主机运行下面的命令,安装需要的工具
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日追加更新:使用方法
Comments 2 条评论
博主 Blackite
请问博主试过用树莓派4b搭建jellyfin吗
博主 幼刀之小丛雨
@Blackite 其实我是尝试过部署jellyfin的,在docker里面使用官方版本或者nyanmisaka/jellyfin版本。可以使用v4l2解码器来进行解码。问题很多,我的树莓派4的同时编解码性能很差,得耐心等,并且我的树莓派4解码hevc会花屏不知道为什么
@Blackite 会报错
@Blackite 至于树莓派5就直接砍掉视频解码器让用软解了,详见jellyfin。
@Blackite 总之jellyfin对树莓派还是太“重量级”了,只适合看不需要烧制字幕不需要转码的h264视频。一旦涉及到转码,就需要花费很多时间,而且转码支持也不完善bug太多了。