2015-10-02 145 views
1

我有一個GStreamer管道從RTSP源播放實時視頻。我希望用戶能夠增加/減少延遲。我的做法是有一個queue元素並操縱其min-threshold-time參數。Gstreamer:動態增加和減少延遲

這似乎開始工作。例如延遲10秒,管道開始凍結,並在10秒後繼續。但如果我操縱時間,沒有任何反應。我也嘗試了其他參數,例如max-size-time,但沒有運氣。 leaky參數會導致視頻不穩定且質量不佳。

目前我正在停止並重新啓動管道,這看起來很糟糕。

管道我使用:

gst-launch-1.0 rtspsrc location=<...> ! rtph264depay ! h264parse ! capsfilter caps=video/x-h264 ! avdec_h264 ! videoconvert ! queue min-threshold-delay=<delay> ! autovideosink 

是否有一個命令來強制隊列沖洗框架,其他的一些元素更適合,或者一些其他技巧來做到這一點?

+1

暫停更改參數和播放怎麼樣?我不確定是否動態更改元素參數只需設置參數即可使用 - 也許您將不得不做一些填充塊阻塞等,就像您[動態改變管道]時一樣(http://gstreamer.freedesktop.org /data/doc/gstreamer/head/manual/html/section-dynamic-pipelines.html) – nayana

+0

@otopolsky:您的建議是一項改進。暫停和重新播放的確能起作用,但是當延遲時間減少時,什麼都不會發生。 –

+0

很高興能有所幫助,你的解決方案是相當先進的使用延遲事件..很好地完成 – nayana

回答

1

得到它的工作。這裏是我的解決方案:

管道:

rtspsrc location=<...> ! rtph264depay ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=$MAX_DELAY ! queue max-size-time=$SMALL_DELAY min-threshold-time=$DELAY ! decodebin ! autovideosink 

其中:

  • $ DELAY =視頻GST時間單位
  • $ MAX_DELAY在消費稅單位時間=最大的視頻延遲的延遲
  • $ SMALL_DELAY =最小延遲,例如以毫秒爲單位,單位gst時間單位

策略是有兩個隊列,第一個隊列充當緩衝區,第二個隊列充當平衡器,確保所有消息延遲正好$ DELAY的時間量。這不能用一個隊列來完成。

運行時間:

當需要改變的延遲,則$延遲值在第二隊列改變。在此之後,流水線需要發送一個延遲事件使用新的延遲作爲延遲。這導致管道暫時凍結(如果延遲增加),或者快速前進以追上(如果延遲減少)。

通過讀取第一個隊列的當前級別時間屬性並將其與設置的延遲進行比較,可以獲得緩衝狀態。

+0

嗨,你怎麼發送延遲事件到管道?從命令行?謝謝! – herrfz

+0

@herrfz事件不能在命令行中發送,因爲它用於創建靜態管道,對於更動態的管道操作,您將不得不使用編程語言來訪問gstreamer API。 –