Gstreamer H264 流水线滞后

Gstreamer H264 pipeline lag

我正在使用 gst-rtsp-server 和以下管道:

gst_rtsp_media_factory_set_launch(factory, "( "
    "appsrc name=mysrc "
    "! videoconvert " 
    "! videoscale "
    "! video/x-raw,format=I420,width=350,height=250 " // fps
    "! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true "
    "! video/x-h264,profile=baseline "
    "! rtph264pay name=pay0 pt=96 mtu=1300 "
")");

传输 H264 视频流(我是 gstreamer 的新手)。我运行正在使用推送模式:

g_object_set(appsrc, "stream-type", GST_APP_STREAM_TYPE_STREAM, NULL);

并且仅通过需要数据回调进行推送。大多数情况下一切都按预期工作。当我 运行 我的服务器时 - 我的摄像机流式传输正常,只是我的流式传输出现 2 秒(大约)延迟。

无论我使用何种设置组合,这种滞后都是一致的。

不同

都是一样的效果。这就像我的流累积了精确的 2 秒延迟,并且从那以后永久偏移。好像 gstreamer 在开始广播之前将其内部缓冲区累积到特定大小。

由于我对 gstreamer 缺乏经验,我对此感到很困惑。如果有人有任何想法或提示指出我 某些 继续调试的方向,我将不胜感激。


编辑:

为了完整性(以防其他人与此问题相关),在@peter 的指导下,我不得不修改我的管道以适应现在更小的缓冲区的 VLC。我不知道这是否 "the correct way",但对我有用。

我基本上让我的 "producer"(我的程序)以 60fps 的速度生成,然后使用 videorate 模块将其缩小到 30fps 以便在管道中传输。有了这个,我能够给 VLC 一个 200 毫秒的缓冲区。这是我的新管道。

gst_rtsp_media_factory_set_launch(factory, "( "
    "appsrc name=mysrc "
    "! videoconvert " 
    "! videoscale "
    "! videorate "
    "! video/x-raw,format=I420,width=350,height=250,framerate=30/1 " // fps
    "! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true "
    "! video/x-h264,profile=baseline "
    "! rtph264pay name=pay0 pt=96 mtu=1300 "
")");

再次感谢@peter。

您的发件人可能 100% 没事。如果我是赌徒,我敢打赌问题出在接收器上。

一些接收器(如 VLC)会想要缓冲视频以防止卡顿。如果您的目标是减少延迟,我会查看您接收器上的选项,如果可能的话,请关闭这些选项。

编辑添加:

看看这个:http://www.groovypost.com/howto/change-vlc-streaming-buffer/ 默认情况下,VLC 有 1500 毫秒(1.5 秒)的缓存。