2016-12-01 37 views
2

我具有層次象下面這樣:控制appsink管線,這取決於它的RTSP appsrc客戶狀態

SourcePipeline

  • GstElement管道(具有videotestsrc和appsink)
  • 一個GstAppSrc指針數組來推樣品

GstRTSPServer

  • GstRTSPMediaFactory(具有GstAppSrc名爲 「appsrc0」 和安裝在 「/測試」)

  • GstRTSPMediaFactory(具有GstAppSrc名爲 「appsrc1」 和安裝在 「/ TEST2」)

我的兩個appsink和appsrc蓋是

caps = "video/x-raw,width=640,height=512,format=GRAY8" 

因此,在媒體的工廠我聽媒體構建的信號,並註冊appsrc指針源管道。另外,當他們的媒體將狀態更改爲GST_STATE_NULL時,我從SourcePipeline中的appsrc數組中刪除指針。

在源管道上,appsink將樣本逐一推送到appsrc。當數組中沒有應用程序存儲器時,管道的狀態將更改爲GST_STATE_NULL,直到第一個appsrc再次加入爲止。

我有一些問題和困難:

  1. 當第一個客戶端連接到RTSP,客戶即刻獲取流。當第二個加入第二個加載點時,當GstRTSPMedia將其狀態更改爲GST_STATE_PLAYING時,流停止,並且在5 - 6秒之後,流再次恢復。雖然這有時不會發生。該流失敗,我無法重新啓動程序之前再次得到它。

  2. 我的方法控制SourcePipeline是否正確?我應該如何在RTSP服務器上做到這一點?

  3. 我將appsrc的block屬性設置爲TRUE。如果我沒有將它設置爲true,它會使用所有內存,直到系統變得無響應。再一次,這裏的正確方法是什麼?

  4. 我目前使用push_sample推緩衝區到appsrcs。 push_sample和push_buffer有什麼區別?哪個更有效?

  5. 當不同掛載點上的2個客戶端正在觀看該流時,當其中一個客戶端斷開連接或停止流時,該流將其斷開。我檢查GstRTSPMedia上的新狀態信號以瞭解RTSP管道的狀態。顯然,這種方法行不通,這裏的正確答案是什麼?

回答

0

我並不需要做appsink和appsrc之間的同步後,我得到了與

GST_BUFFER_TIMESTAMP(buf) = timestamps[i]; 
GST_BUFFER_DURATION(buf) = bufferDuration; 
timestamps[i] += GST_BUFFER_DURATION(buf); 

我已經有大約緩衝的時間標記的猜疑解決時間戳,但無法弄清楚如何解決它們。只要在源管線和下沉管線之間使用相同的時鐘,這3條線就可以輕鬆解決問題。