繁体   English   中英

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);

并且只通过need-data回调推送。 一切都按预期工作。 当我运行我的服务器时 - 我的相机正常流,除了我的流经历了2秒(大约)延迟。

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

不同

  • 比特率
  • 相机分辨率
  • 以4 fps运行: GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 4);
  • 以30 fps运行: GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 30);

都具有相同的效果。 这就像我的流累积了2秒的延迟,并且从那时起永久地被抵消了。 好像gstreamer在开始广播之前将其内部缓冲区累积到特定大小。

由于我对gstreamer的经验不足,我对此感到困惑。 如果有人有任何想法或提示指出我在某个方向继续调试这一点,将不胜感激。


编辑:

为了完整性(如果其他任何人都与这个问题有关),在@peter的指示之后,我不得不修改我的管道以适应VLC现在更小的缓冲区。 我不知道这是否是“正确的方法”,但它对我有用。

我基本上让我的“生产者”(我的程序)以60fps的速度生成并将其缩小到30fps,以便使用videorate模块在管道中进行传输。 有了这个,我能够给VLC一个200ms的缓冲区。 这是我的新管道。

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秒)的缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM