我正在开发一个 RTSP 服务器,它应该模拟实时源,同时从文件中流式传输数据。
我目前拥有的主要是基于gst-rtsp-server示例test-readme.c,只有以下管道:
gst_rtsp_media_factory_set_launch(factory, "( "
"filesrc location=stream.mkv ! matroskademux name=demuxer "
"demuxer. ! queue ! rtph264pay name=pay0 pt=96 "
"demuxer. ! queue ! rtpmp4gpay name=pay1 pt=97 "
")");
这很好用,除了一个问题:当 RTSP 客户端(使用 RTSP/TCP 交错传输)无法接收数据时,整个管道会锁定,直到客户端再次准备好,然后恢复到原始位置而没有任何跳跃。
由于我想模拟无法无限期缓冲其视频的实时源,因此在这种情况下所需的行为是继续播放文件,因此当客户端阻塞 5 秒时,它将失去 5 秒的记录。
我试图通过限制队列大小并将它们设置为泄漏来实现这一点(通过将它们设置为queue max-size-bytes=1000000 max-size-time=1000000000 leaky=upstream
,这应该为大约 1 秒的视频提供缓冲区,但仅此而已)。这并没有完全像我希望的那样工作:源和解复用器填满了队列,然后在 0.1 秒内完全清空了自己。
我想我需要一些方法来限制队列之前的管道吞吐量,或者通过将解复用器限制为实时解复用,或者找到/制作一个 gstreamer 过滤器,让每 1 秒实时通过 1 秒数据。
您对如何执行此操作有任何提示吗?