Gstreamer tsdemux 在通过 UDP 接收 MPEG TS 负载时报告 "CONTINUITY: Mismatch packet"

Gstreamer tsdemux reports "CONTINUITY: Mismatch packet" while receiving MPEG TS payload via UDP

我的流程如下(我通过 RTP 接收 MPEG TS H264 视频):

gst-launch-1.0 -v udpsrc address=127.0.0.1 port=1200 ! decodebin ! rtpvrawpay ! rtpbin ! udpsink host=127.0.0.1 port=2250

开始视频传输后几秒钟正常,但随后出现错误:

tsdemux.c:2413:gst_ts_demux_queue_data: CONTINUITY: Mismatch packet 2, stream 6

后跟错误:

libav gstavauddec.c:628:gst_ffmpegauddec_drain:<avdec_mp2float0> send packet failed, could not drain decoder

之后无法再正常播放,我需要重新启动管道。是什么原因导致错误以及如何修复?

原来问题出在发送器由于某种原因不发送关键帧。这也可能是由 UDP 连接问题引起的 - 它有时可能会丢失数据包。

尽管如此,VLC 可以很好地播放原始流,所以这应该也可以通过 gtsreamer 实现(通过使用 udp://@:1200 地址播放流)。

我设法通过将缓冲区大小增加到 100 兆字节来解决问题,如下所示(我还提供了从流中播放视频以检查其是否正常工作的测试):

gst-launch-1.0 udpsrc address=127.0.0.1 port=1200 buffer-size=100000000 ! tsdemux parse-private-sections=TRUE ! h264parse ! avdec_h264 ! autovideosink sync=false