我使用gst-rtsp-server具有下列管道:的Gstreamer H264管道滯後
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秒(大約)的延遲。
無論我使用哪種設置組合,此延遲都是一致的。
不同
- 比特率
- 的攝像頭分辨率
- 在4 fps的運行:
GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 4);
- 運行在30fps:
GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 30);
都具有相同的效果。這就像我的流積累了一個確切的2秒的滯後時間,並且從那以後永久地被抵消了。就好像gstreamer在開始廣播之前正在將其內部緩衝區積累到特定的大小。
因爲我對gstreamer缺乏經驗,所以我對此持平。如果有人有任何想法或提示指向我一些方向繼續調試,這將不勝感激。
編輯:
爲了完整(如果任何人涉及到這個問題),之後@peter的方向,我不得不改變我的管道,以適應現在的VLC緩衝較小。我不知道這是否是「正確的方式」,但它對我有用。
我基本上使我的「製作人」(我的程序)以60fps的速度製作,並使用videorate
模塊將其縮小到30fps以用於傳輸。有了這個,我能夠給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。
@peter皮特,你是我的朋友(我甚至忘了提及我使用的接收器確實是VLC),謝謝。我幾天來一直在爲此撓頭。我希望我能做的不只是打字謝謝 - *流下了眼淚* - 謝謝! – JDR