少于 1 分钟阅读 次阅读

1 问题背景与环境

  • 硬件平台:Rockchip RK3588 (ARM64 架构)
  • 显示环境:X11 视窗系统
  • 核心操作:客户通过官方源码(freedesktop)手动编译升级 GStreamer 至 1.20 版本。

2 现象描述

搭建本地 MediaMTX RTSP 服务器推流测试时,画面虽然成功显示,但极其卡顿,终端输出:

A lot of buffers are being dropped. There may be a timestamping problem...

同时 htop 显示 gst-launch-1.0 单核 CPU 占用率达到约 80%。

3 根因分析

  1. 时间戳同步过于严苛:原命令包含强实时性参数(latency=0, sync=true)。本地循环推流时,网络时间戳(PTS)存在抖动,且硬解与 OpenGL 渲染有固定耗时。GStreamer 严格比对系统时钟后判定帧“迟到”,触发了大量的主动丢帧 (Drop)
  2. 缓冲队列过极度受限:原命令中 queue max-size-buffers=1 限制了缓冲池只有 1 帧,毫无容错率。
  3. 单核 80% 的 CPU 消耗:在 X11 下,glupload 插件往往无法完美实现 dmabuf 的零拷贝。解码后的数据从硬件内存搬运到 GPU 渲染管线时,消耗了大量的 CPU 拷贝算力(RK3588 是 8 核,单核 80% 约为整机 10% 负载,属正常范围,但仍有优化空间)。

4 解决方案

修改 Pipeline 参数,放宽网络缓冲容忍度,强制禁用时间戳丢帧机制。

调优后的 Pipeline:

gst-launch-1.0 rtspsrc location="rtsp://127.0.0.1:8554/mystream" protocols=4 latency=300 ! rtph264depay ! h264parse ! mppvideodec arm-afbc=false ! queue max-size-buffers=5 ! glupload ! glcolorconvert ! glimagesink sync=false qos=false max-lateness=-1

参数调整说明:

  • latency=300:增加 300ms 网络抗抖动缓冲。
  • queue max-size-buffers=5:扩充缓冲池,平衡延迟与平滑度。
  • sync=false qos=false max-lateness=-1:关闭严格时间同步与丢帧控制,只要解码完成强制立即渲染。

性能极限优化建议 (零拷贝):如果彻底追求极致性能并释放 CPU,建议在支持良好的视窗环境下(通常为 Wayland/DRM,X11 下需测试),将 glupload ! glcolorconvert ! glimagesink 这一串重负载的 OpenGL 渲染链路,替换为瑞芯微专属的硬件图层插件 rkximagesink。 (零拷贝还未适配成功)

留下评论