树莓派升值计划——流畅播放 30 帧 1080p 网页视频

TL;DR

在树莓派 4B (实测 4G 内存,目测 2G 够用) 上流畅播放网页视频需要使用 OpenGL 驱动,并将 PulseAudio 调整至使用中断而不是时钟。可选的性能提升有切换至 64 位内核以及超频,但这些只能轻微提升。

可以做到的效果是 YouTube、bilibili、爱奇艺播放 30 帧 1080p 的视频的时候视频没有大卡顿(主要是偶尔有撕裂),音频完全没有卡顿。

背景

树莓派是一款便宜的卡片尺寸的小电脑。但它体型虽小五脏俱全,可以运行完整的 Linux 系统。最新的顶配版本树莓派 4B 4G 内存版仅需 55 美元,实乃便宜好用的码农玩具。考虑到它的价格,只要能实现任意一个「实用」功能就称得上是回本,而这次我想要让它「物超所值」——接在电视上播放 1080p 在线视频。

小道消息:据说树莓派是亏本卖的

树莓派一出现其实就打着可以充当视频播放器的招牌,但实际上它的实现与日常使用差距很大——早先树莓派只支持 OpenGL ES,并且视频硬解必须使用它的闭源驱动,这导致只有少数做了适配的软件可以充分利用树莓派独特的硬件资源,例如 Kodi 和 SteamLink(强烈安利,可香了,当年沉迷在客厅下自走棋)。说它硬件资源独特是因为它有着孱弱的 CPU 和难以利用的 GPU,以及非常局限的内存(1G)。而这一切随着树莓派 4 的到来不再是问题——CPU 增强,OpenGL 驱动成熟(顺带也解决了 64 位内核的驱动问题),以及 4G 内存版本的出现。

这让我重新捡起了曾经用树莓派代替上网本(即升值计划)的尝试。我的目标只有一个——能看 YouTube 视频。

使用 OpenGL 驱动

使用 OpenGL 驱动倒不是为了硬解视频,因为 Chrome 本来就不支持 Linux 下硬解视频。好在树莓派 4 的 CPU 已经足够强了。因此使用 OpenGL 驱动的目的其实是把桌面渲染交给 GPU,好把宝贵的 CPU 资源让给视频和音频。

树莓派 4 默认使用的就是 OpenGL 驱动。有两方面需要确认:

首先通过运行 screenfetch 来确定驱动是否运行。GPU 若显示的是 V3D 4.2 那就说明驱动已经安装并运作了。

其次树莓派应当可以自动检测屏幕分辨率,如果不能说明 fbturbo 没有安装,请安装 fbturbo,然后编辑 /usr/share/X11/xorg.conf.d/99-fbturbo.conf(需要 sudo),删除 Driver "fbturbo" 这一行(不然就用回闭源 OpenGL ES 驱动啦,如果是在 64 位内核下的话甚至 xserver 会崩溃)。

确认 OpenGL 驱动正常后就可以启动 Chromium 了。前往 chrome://gpu 查看各项 GPU 功能是否已经启动。可以参考我的截图哪些应该是绿的哪些应该是红的。如果有项目是红的但我截图里是绿的,可以尝试前往 chrome://flags 并搜索 #ignore-gpu-blacklist 然后启用它。

调整 PulseAudio

这个时候也许你兴冲冲地打开视频网站跃跃欲试了,然后你会沮丧地发现卡得妈都不认得了。别急,如果你细心观察播放视频时候的 CPU 占用,尤其是把浏览器最小化但是视频仍然在播放的时候的 CPU 占用,很快就能得出结论瓶颈并不在 CPU。实际上,卡的只有音频,实际上那是由于新版的 PulseAudio(Linux 桌面的一个音频管理系统)使用了基于系统时钟的模型,而在某些硬件(例如 Creative 声卡)条件下时钟并不可靠,或者 CPU 调度导致错过时机。在这个情况下可以通过修改 PulseAudio 的设置来使用旧版本的基于中断的模型。

具体方法是:编辑 /etc/pulse/default.pa (需要 sudo,或者你可以复制一份到 ~/.config/pulse/default.pa 这样就不需要 sudo 了),找到 load-module module-udev-detect,将其修改成 load-module module-udev-detect tsched=0 即可。

其他细微提升

使用 64 位内核

目前官方的 64 位内核已经进入测试阶段了,只需要在 /boot/config.txt 中加一行 arm_64bit=1 就可以直接使用了。注意用户态系统并不会自动切换到 64 位,而 Raspbian 目前也没有 64 位的 build,因此这实际上是 32 位用户态系统跑在 64 位内核上。如果需要运行 64 位软件的话(例如 Amazon Corretto),建议用 lxc 跑一个 64 位的系统容器。

切换到 64 位内核的提升来自于内核态 LPAE 的消耗,我并没有做过测试具体能提升多少,我换 64 位内核主要是因为我想跑 64 位容器……

超频

树莓派超频就不多说啦,但是提升真的有限,1.50 GHz 升到 1.65 GHz 又能怎样呢……该卡的还是卡,不卡的照样不卡。我企图通过超频的方式去流畅播放 YouTube 上ギガP的《劣等上等》,可是不管超了还是没超,开头稳定卡住那么一下。至于为何ギガP的视频稳定卡正好一下,我也不知道他压制的时候用了什么魔法……

仍然存在的问题

视频渲染会有撕裂。没办法啦毕竟是 CPU 渲染,我不知道换成 Wayland 跑会不会好些。其实现在新驱动的视频硬解已经做好了,而 Chrome 那么多年了还是没计划在 Linux 上支持硬解。

某些格式或高帧率的视频仍然无法流畅播放。当然绝大多数视频不再此类。判断方法是开个 top 发现 CPU 占满了。


(本文写作于 Raspberry Pi 4)

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">