在晶晨A311D2处理器上进行Linux硬件视频编码

原文链接:Linux hardware video encoding on Amlogic A311D2 processor 由Jean-Luc Aufranc撰写。
本文共计3595字,预计阅读7分钟

在Khadas VIM4 Amogic A311D2 SBC上,我更多的时间是在使用Ubuntu 22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视频解码等功能。最近,我在Wiki中看到它可以支持Linux硬件视频编码的内容,我真的有点兴奋。因为之前我很少看到它可以对这个功能提供支持,所以我决定试一下。

首先,我们需要制作一个NV12像素格式的视频,这通常是由摄像头输出的。然后我从Linaro下载了一个45秒的1080p H.264示例视频,并使用ffmpeg(一个开源软件,可以执行音讯和视讯多种格式的录影、转档、串流功能)对其进行了转换:


对了,我是在自己的笔记本电脑上直接操作的。作为原始视频,它还挺大的,45 秒的视频占用了3.3GB的存储空间,如下所示:


现在我尝试使用aml_enc_test硬件视频编码示例在Khadas VIM4板上将视频编码为H.264,如下所示:


上面的输出也解释了使用参数。上面有一些错误的消息,但视频可以在我的计算机上使用ffplay播放而且不会出现问题。

晶晨A311D2 H.264视频编码的示例
晶晨A311D2 H.264视频编码的示例

我们可以看到编码的时长是26秒左右,这比实时编码的速度还要快,因为视频的实际时长是45秒。

接下来我们尝试使用H.265编码,如下所示:


这着实有点令人惊讶,不过H.265视频编码确实是要比H.264视频编码快得多。我再次尝试使用H.264编码看看:


哇!现在只需不到9秒了。第一次从eMMC闪存读取数据的时候还是挺慢的,但是由于文件是3.3GB的,它可以放入缓存,所以第二次就没有存储瓶颈了。

晶晨A311D2 H.265硬件视频编码的示例
晶晨A311D2 H.265硬件视频编码的示例

尽管如此,dump.H265文件也还可以在我的计算机上正常播放,因此这个转换是成功的。

晶晨A311D2规范上也说它是支持“H.265和H.264 at 4Kp50”视频编码的。因此,我创建了一个45秒的4Kp50视频并将其转换为NV12 YUV格式。原始视频的大小是27GB,板载eMMC闪存空间不够(32GB),我只好让把视频缩短到了30秒(大约18GB)。

现在我们可以将视频编码为H.264了,如下所示:


两分钟编码一个30秒的视频!!!事实证明这并没有减少它的时间,所以我再次运行示例看看:


这次甚至更慢,我觉得这应该是到存储瓶颈了。因为对于实时编码来说,这个文件所需的读取速度应该要超过600 MB/s。该系统通常会编码来自摄像头流的视频,而不是来自eMMC闪存的视频。我之前其实运行过iozone(文件系统测试工具)。如下所示:


顺序读取速度大约是178MB/s。我有一个带有480GB SSD的MINIX USB集线器,于是我以400MB/s的速度进行了测试。这可能并不完全是我们需要的,但应该会有所改善。

Khadas VIM4 USB-C SSD
Khadas VIM4 USB-C SSD

比较遗憾的是,驱动器没有安装,即使使用fdisk和GParted等工具也无法识别。在仔细检查了Khadas VIM4规格,我意识到USB Type-C端口是一个USB 2.0 OTG接口,应该是可以识别驱动器的,但只支持480 Mbps,所以无论如何这应该试验失败的原因之一。因为实现超过600MB / s的唯一方法是使用USB 3.0 NVMe SSD,但我没有。

因此,我需要制作一个大小约为2.9GB、时长5秒的4Kp50视频。

我第一次使用H.265运行,如下所示:


第二次运行,如下:


最后一次尝试使用了H.264:


虽然不是实时的,但结果越来越接近,这就意味着4Kp30应该是可行的。以下是使用H.264编码5秒4Kp30 NV12视频的结果:


这次的用时不到4秒。所以实时4Kp30 H.264的硬件视频编码肯定是可以在晶晨A311D2处理器上工作的。

晶晨A311D2的4Kp30硬件视频编码
晶晨A311D2的4Kp30硬件视频编码

看,在我的电脑上也可以正常播放。也可以将NV12 YUV图像编码为JPEG,但这一点不适用于khadas用户。


对了,使用sudo命令确实也没什么问题。


所以,这可能只是一个简单的权限问题。在44 ms内就完成任务了,我也可以正常打开dump.jpg(屏幕截图)。

在晶晨A311D2上进行jpeg硬件编码
在晶晨A311D2上进行jpeg硬件编码

接着我使用ffmpeg将NV12文件转换为了jpeg,这个过程可能是因为使用了软件编码,因此只需要不到200 ms:


aml_enc_test和jpeg_enc_test其实都是很好用的小工具,可以用在晶晨A311D2上测试Linux中的硬件视频和图像编码。而且将其集成到应用程序中得到源代码也会更方便。但目前代码似乎没有开源,所以我认为它是晶晨SDK 的一部分。之后,我会向Khadas方面要源代码或者相关的获取方法。

分享这篇文章
订阅评论
提醒
0 评论
内联反馈
查看所有评论