RK3588 上手体验

千等万等,RK 3588 终于到手了,虽然它是准预售版本,虽然认识的大佬两个月前就拿到了开发者版本,但是不影响我现在开始折腾。

系统安装

写这篇文章的时候,Rock 5B 或者说 RK 3588 还没进到内核。最大的问题来自 GPU 驱动,Rockchip 不舍得花钱买 Mali G610 的 GPU 驱动,还得等大佬逆向,而且这个时候那个大佬还在做 M1 的 GPU 驱动,所以还要等相当长的一段时间。所以这个时候就只能 Rockchip 提供的 5.10 内核。

Radxa ( Rock5 的制造商)提供了 Debian 和 Ubuntu 的 Build,但是不太好用,尤其是那个 Debian Desktop 2022.09.01,有 Bug 会让启动桌面的时候整个板子卡死。

推荐使用 armbian/build 自己构建一份,armbian 的默认配置比 radxa 丰富些,比如开了 kvm 和一堆网卡驱动。不过需要注意的是,写文章的时候,armbian 的 rock5 仍然是 wip 状态,需要点击下面的 SHOW WIP 才能出来。

使用 armbian 会有其他的问题,比如 rga,比如不能用 spi boot,所以推荐用 radxa 的,自己修改内核。

image.png

NVME 启动

没想到连 arm 板子都可以用 nvme 并且从中启动了,需要先把 uboot 写到 spiflash 里,参考官方 Wiki

但是这个 uboot 不能启动 armbian 的,也不知道是这个 uboot 的问题,还是 armbian 的 uboot.scr 的问题。

性能测试

首先当然跑个分看看,这里我就不和 RK 3399 比了,直接和我的 NAS 上 J4125 比较:


RK 3588J4125
7z compress1665/12278
1886/6174
7z decompress2363/156262379/7728
Geekbench 5559/2374
460/1488

不跑太专业的了,这点娱乐跑分已经可以说明问题了,单核和 J4125 其实差的不多,但是 RK 3588 胜在它有 4xA72 + 4xA53。

而且 RK 3588 由于制程的进步,在发热量上比 3399 有了巨大的进步。用同款散热器,不打开风扇,3399 0 负载下能有 45 度,3588 只有 37 度。满负载打开风扇 3588 也只有 45 度,3399 快 50 度了。

桌面使用

首先游戏是不太现实,GPU 的驱动是烂的。

虽然有一个用户空间的驱动 libmail,但是很少有程序能用,除了 rk 给的那个 glmark-es,包括桌面本身都是跑在 llvm-pipe 下的 (CPU 渲染),这样还能输出 4k@60,我已经很感动了。

因为桌面也是 CPU 渲染的,导致在进行复杂操作,比如播视频的时候也会大量占用 CPU。在 gnome 这种特效很高的 DE 下,动画效果非常卡顿,就算是 XFCE 这种,在拖动窗口的时候也会有撕裂。

总的来说,暂时不适合作为桌面使用。

视频编解码

视频编解码才是 RK 3588 的重点,但是宣传的很美好,实际的使用体验并没有那么美好。

修改 udev

在这之前,要修改 udev 配置

sudo -i
echo 'KERNEL=="mpp_service", MODE="0666", GROUP="video"' > /etc/udev/rules.d/50-mpp.rules
echo 'KERNEL=="rga", MODE="0666", GROUP="video"' > /etc/udev/rules.d/50-rga.rules
udevadm control --reload && udevadm trigger
adduser "你的用户名" video

这么做的原因是 rockchip 是从 3399 的 rootfs 直接改过来的,3399 里处理编码的模块是 /dev/vpu-service ,但是在这里应该是 /dev/mpp_service

还有一个 /dev/rga 这个不是直接参与编码的,但是当视频格式不满足 mpp 的输入时,比如长宽不满足 16 的倍数,视频格式不是 NV12 时,都会调用这个做一点转换。

ffmpeg

首先是大家最熟悉的 ffmpeg,先说结论:不能用

rockchip 之前给 ffmpeg 提交过一些代码,让它可以支持 rkmpp (rockchip 的视频编解码模块),但后来因为协议问题,就搁置了。到现在,ffmpeg 也只能调用解码器,而不能编码,而且编码器还是坏的 😅 。

但还是说下怎么用吧,正常发行版的 ffmpeg 都不带 rkmpp 支持,要自己下载,如果添加了 radxa 的源,可以直接 apt install librockchip-mpp-dev,如果没有的话,则要自己编译 mpp

然后重新编译 ffmpeg

./configure --enable-version3 \
    --enable-drm \
    --enable-rkmpp \
    --enable-libx264 \
    --enable-libx264

ffmpeg 硬解

ffmpeg -benchmark -c:v h264_rkmpp -i test.mp4 -f null -

然后就会收获一堆报错。

gstreamer

前面有说到 rockchip 因为协议的问题,不再做 ffmpeg 的适配,而是将重心转向了协议较为宽松的 gstreamer。

添加了 radxa 源的,可以从源里下载 gstreamer 以及 mpp 的插件 gstreamer1.0-rockchip1,或者可以自己编译 gstreamer-rockchip

如何确认自己能使用 mpp 的插件?

gst-inspect-1.0 |grep mpp
typefindfunctions: audio/x-musepack: mpc, mpp, mp+
rockchipmpp:  mppjpegdec: Rockchip's MPP JPEG image decoder
rockchipmpp:  mppvideodec: Rockchip's MPP video decoder
rockchipmpp:  mppjpegenc: Rockchip Mpp JPEG Encoder
rockchipmpp:  mppvp8enc: Rockchip Mpp VP8 Encoder
rockchipmpp:  mpph265enc: Rockchip Mpp H265 Encoder
rockchipmpp:  mpph264enc: Rockchip Mpp H264 Encoder

如何使用 gstreamer 编解码

解码

gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! queue ! h264parse ! mppvideodec ! videoconvert ! autovideosink

值得吐槽的是,虽然宣传的时候说支持 av1 硬解,但是 gstreamer 里并没有适配,mpp 的代码倒是写好了,需要的话只能自己去调用 mpp

编码

gst-launch-1.0 videotestsrc ! mpph265enc ! filesink location=test.mp4

HDMI IN

4k 输入录屏也是 3588 的宣传重点之一,那它能不能用呢,也是我非常期待的一部分,原本是打算将 3588 做成 Xbox/Switch 的串流器用的,那它能不能用呢?

部分能用

查看 HDMI IN 信息

这是 switch 接上去的输出

$ v4l2-ctl -d 0 -V
Format Video Capture Multiplanar:
        Width/Height      : 1920/1080
        Pixel Format      : 'BGR3' (24-bit BGR 8-8-8)
        Field             : None
        Number of planes  : 1
        Flags             : premultiplied-alpha, 0x000000fe
        Colorspace        : Unknown (0x00000018)
        Transfer Function : Unknown (0x00000040)
        YCbCr/HSV Encoding: Unknown (0x000000ff)
        Quantization      : Default
        Plane 0           :
           Bytes per Line : 5760
           Size Image     : 6220800

这是 xbox 接上去的输出

$ v4l2-ctl -d 0 -V
Format Video Capture Multiplanar:
        Width/Height      : 3840/2160
        Pixel Format      : 'NV12' (Y/CbCr 4:2:0)
        Field             : None
        Number of planes  : 1
        Flags             : premultiplied-alpha, 0x000000fe
        Colorspace        : Unknown (0x00000018)
        Transfer Function : Unknown (0x00000040)
        YCbCr/HSV Encoding: Unknown (0x000000ff)
        Quantization      : Default
        Plane 0           :
           Bytes per Line : 3840
           Size Image     : 12441600

要吐槽的是,虽然它这个接口是 HDMI 2.0,理应支持 4k@60 fps yuv444,但是这里却是 420。应该是可以靠改 edid 来实现,但是我没有研究怎么改。不过无妨,因为编码器只能输入 NV12 即 420。

显示抓取的画面

使用 v4l2

v4l2-ctl -d 0 --set-fmt-video=width=3840,height=2160,pixelformat=NV12 --stream-poll --stream-to=- | ffplay -f rawvideo -video_size 3840x2160 -pixel_format nv12 -

然后会发现达不到 60fps 并且 CPU 占用巨大,理论上 rawvideo 应该不用解码,不应该会有 cpu 占用,但是因为桌面是 cpu 渲染的,播放 4k 视频的时候会大量占用 cpu 用在渲染桌面上,并且帧率还达不到 60fps。

使用 gstreamer

gst-launch-1.0 v4l2src device=/dev/video0 \
    ! video/x-raw,width=3840,height=2160,format=NV12,framerate=60/1 \
    ! queue ! xvimagesink

同理,达不到 60fps。

这个桌面渲染的问题只能等到 gpu 驱动修好了才能用了

编码和串流抓取的画面

虽然不能直接回显,但是我能录屏和串流啊,,,能吧?

不太行

gst-launch-1.0 v4l2src device=/dev/video0 \
    ! video/x-raw,width=3840,height=2160,format=NV12,framerate=60/1 \
    ! queue ! mpph265enc ! filesink location=test.mp4

然后就可以用 mpv 播放了,为什么说它不太行呢,因为有个大 bug —— mpp 编出来的没有关键帧,意味着你没有办法拖动视频,所有的操作都会让你回到开头。

这也导致了另一个问题 —— 不能串流

本来是打算用 hls 做串流的,正好 gstreamer 也有 hlssink,但是这个是依赖关键帧做视频切割的,没有关键帧它就不会切了,所以不行。

但是我看 mpp 的代码里是有关键帧的相关的内容,mpph265enc 的参数里也有 header-mode 这个看起来相关的东西,但是实测依然不能实现,这就没办法了。我打算后期尝试一下自己调用 mpp 编码看看。

总结

硬件上趋于完善,软件上急需改进

硬件上挑不出来什么毛病,各种外设也很齐全。但是软件上的小毛病实在是太多了,导致完全做不到他宣传的效果。期待一波进主线内核,至少 GPU 驱动要给我修好吧。还有 EDK2 如果能做好的话,那就可以想装什么发行版装什么了,和 PC 没有什么区别了。

未来可期