几年前在垃圾桶捡到几个Orange Pi Plus 2,配置较低,放在2024年的今天已经做不了什么事情了,唯一还能用是的就是他支持HEVC硬件解码4k30fps输出,可以当机顶盒来用,并在内核主线支持较为完善,有Armbian系统和LibreElec系统可选。
我这里记录的是在Orange Pi Plus 2上安装LibreElec和Armbian,并调整参数使得硬件解码可以正常使用。
请注意文章发布时间,随着时间的推移可能有些描述会变得不准确。
Orange Pi Plus有几个马甲,分别是Orange Pi Plus、Orange Pi Plus 2、Orange Pi Plus 2E。
其中Orange Pi Plus 2在全志的官网是已经找不到描述了,但是他们3个基本一致,固件通用。
Orange Pi Plus soc是Allwinner H3,内存是1+8,带sata口和wifi。
Orange Pi Plus 2 soc是Allwinner H3,内存是2+16,带sata口和wifi。
Orange Pi Plus 2E soc是Allwinner H3,内存是2+16,没有wifi和sata。
在LibreElec官网可以下载到Orange Pi Plus和Orange Pi Plus 2E 固件,我这里用的是Orange Pi Plus固件。直接按照官网的方式写入sd卡,LibreELEC 12.0.0 版本刷入之后,黑屏无法引导,用LibreELEC 11.0.6 的就正常了,原因不明。
LibreElec已经做好了适配,直接播放8bit HEVC和8bit AVC编码的视频可以看到已经在使用硬件解码。H3不支持10bit的硬解,播放10bit视频时候使用cpu软解,卡顿到基本无法观看。
所以这么简单就完了吗?如果是的话就不会有这个记录了。在LibreElec下面无论播放HEVC还是AVC的视频,分辨率1080P还是4K,都会出现绿屏和马赛克。查看dmesg会发现很多报错。
1 | 8月 04 10:40:24 LibreELEC-PIPLUS2 kernel: vmap allocation for size 12447744 failed: use vmalloc=<size> to increase size |
查阅了Google,大致意思就是cma内存和vmalloc的内存分配得不够导致。通过 cat /proc/meminfo
可以看到LibreEleccma默认分配 CmaTotal
320M,VmallocTotal
内存240M。
1 | VmallocTotal: 245760 kB |
把他们增加到512M,问题解决。编辑文件 /flash/extlinux/extlinux.conf
(由于 /flash
是只读挂载,现修改为要读写挂载才能顺利编辑),在 APPEND boot=
行的最后加入 cma=512M vmalloc=512M
1 | mount -o remount,rw /flash |
修改完成后重启系统,再次 cat /proc/meminfo
查看,CmaTotal
和 VmallocTotal
都是 512M 了,播放视频没有马赛克,没有绿屏,也不卡顿了,切换视频也是秒切。问题解决。
1 | VmallocTotal: 524288 kB |
既然LibreElec可以完美支持硬解,那在Armbian上安装Kodi是不是也可以做同样的事情呢?
对比LibreElec,Armbian上可以使用原机的Wifi模块,可以通过开hostapd热点当路由器使用,也可以安装LXC开小鸡,做一个小小的ALL in one。
在Armbian的官网https://www.armbian.com/orange-pi-plus/ 上可以找到 Orange Pi Plus的镜像,和 Orange Pi Plus 2可以通用。
下载后用balenaEtcher写入SD卡,就可以引导进系统了。不过实测发现 Bullseye 和 Bookworm 都是黑屏无法引导,和LibreELEC 12.0.0一样原因不明。在历史版本 https://stpete-mirror.armbian.com/archive/orangepiplus/archive/ 中找到 Buster 也就是对应 Debian 10的版本,刷入后可以正常引导了,然后通过 apt dist-upgrade
一级一级升到 Bookworm 。
/etc/apt/sources.list
改成中科大的apt源,否正几天几夜都升不完。
Buster源
1 | deb https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free |
Bullseye源
1 | deb https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free |
Bookworm源
1 | deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware |
直接用 apt
安装 kodi
会发现根本无法启动,原因也是 cma内存
和 vmalloc内存
分配有关系,编辑文件 /boot/armbianEnv.txt
加入内核启动参数,然后重启系统。
1 | ##加入一行 |
增加 cma内存
和 vmalloc内存
后 kodi
可以正常启动了,但是播放视频会发现只有软解没有硬解。
跟据Google查阅资料 Allwinner 硬解需要用到 libva-v4l2-request
,ffmpeg
开启v4l2request
选项编译, kodi
开启 gles
选项编译,并且只支持gbm
窗体,不支持wayland
和 x11
。
Armbian的 kodi
是由 Debian 仓库提供和维护的,不在 kodi 官方的PPA仓库里面,没有开启gles
。
直接通过 ffmpeg
命令可以看到 ffmpeg
的 built
选项,需要有--enable-v4l2-request
--enable-libdrm
--enable-libudev
才行。
1 | ffmpeg |
因为v4l2-request
还没并入 ffmpeg
主线,通过apt
安装 ffmpeg
不支持v4l2-request
的。
libva-v4l2-request
这个库自然也是没有的,所以全部都需要自行编译。
libva-v4l2-request
https://github.com/bootlin/libva-v4l2-request 会报错无法编译,后来翻 issues
找到了一份 fork https://github.com/noneucat/libva-v4l2-request.git 总算成功了。
照着 LibreELEC 的源码给 ffmpeg
打 patch 让 ffmpeg
支持 v4l2_request
https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/multimedia/ffmpeg/patches
以上这些编译已经是2021年的时候事情了,期间花费了一周多,中间过程遇到了无数问题,没有一一记录,大部分已经忘记了。
但是到了2024年的今天,已经有人做过同样的事情,并且提供了二进制版本,直接安装就行了。
可以通过一下命令测试 ffmpeg
的硬解加速是否有效,如果正常播放,并且CPU占有没有达到100%,说明 ffmpeg
可以正常调用硬解解码,测试用的视频文件在这里 https://repo.jellyfin.org/jellyfish/
1 | ffmpeg -benchmark -hwaccel drm -i jellyfish-3-mbps-hd-h264.mkv -f null - |
最后还要把 kodi 重新编译一下,过程过于复杂,限于篇幅,只能在下一文继续了。
Enjoy~~
参考:
https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/
https://github.com/bootlin/libva-v4l2-request/issues/23
https://forum.armbian.com/topic/25473-hardware-accelerated-video-decoding-in-kodi-on-orange-pi-pc-plus/
https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/
https://linux-sunxi.org/Kodi
https://archive.fosdem.org/2018/schedule/event/kodi/attachments/slides/2166/export/events/attachments/kodi/slides/2166/FOSDEM_Presentation_2018___Lukas_Rusak.pdf
https://github.com/yoyoliyang/hi3798m_debian/issues/6
https://github.com/raspberrypi/firmware/issues/1603
https://forum.armbian.com/topic/11551-4kp30-video-on-orange-pi-lite-and-mainline-hardware-acceleration/
https://forum.libreelec.tv/thread/25283-allwinner-h6-hevc/
https://forum.libreelec.tv/thread/17565-nightly-images-for-a64-h3-h5-h6-and-r40-boards/?pageNo=93
https://forum.armbian.com/topic/15018-change-cma-memory-allocation-size/
http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Plus-2E.html
https://linux-sunxi.org/Xunlong_Orange_Pi_Plus_2
https://forum.libreelec.tv/thread/27915-explanation-of-the-ffmpeg-patches/
https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/multimedia/ffmpeg/package.mk