048、多路视频流合成画面撕裂?GPU 硬编解码管线、PTS 同步与合成加速方案
一、从一次凌晨三点的事故说起
去年做某安防平台的多路合成项目,八路1080p摄像头实时拼接成4K输出。调试到凌晨,画面总是出现横向撕裂——上半帧是通道1的监控画面,下半帧突然跳到通道3,中间还夹着半帧花屏。客户那边盯着屏幕,说“你们这画面跟鬼片似的”。
当时第一反应是解码线程同步出了问题。但排查后发现,解码器输出队列里每帧的PTS(Presentation Time Stamp)都正常,GPU硬编码器也没报错。问题出在合成环节:我们用CPU做YUV数据拷贝,再传给GPU做缩放和拼接,CPU和GPU之间的数据搬运产生了不可控的延迟,导致不同通道的帧在时间轴上错位。
二、GPU硬编解码管线:别被“硬”字骗了
很多人以为用了GPU硬编解码就万事大吉,其实管线设计才是坑最多的地方。以NVIDIA的NVENC/NVDEC为例,典型的管线长这样:
[摄像头] → [NVDEC解码] → [GPU显存] → [CUDA/NPP处理] → [NVENC编码] → [输出]这里有个关键点:NVDEC解码出来的帧默认在GPU显存里,但如果你用CPU去读这个显存(比如做像素级处理),就会触发PCIe回读,带宽直接打满。我们当时就是犯了这个错——在CPU里做YUV到RGB的转换,再传回GPU做合成,来回折腾两次PCIe传输。
正确做法