我具有層次象下面這樣:控制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再次加入爲止。
我有一些問題和困難:
當第一個客戶端連接到RTSP,客戶即刻獲取流。當第二個加入第二個加載點時,當GstRTSPMedia將其狀態更改爲GST_STATE_PLAYING時,流停止,並且在5 - 6秒之後,流再次恢復。雖然這有時不會發生。該流失敗,我無法重新啓動程序之前再次得到它。
我的方法控制SourcePipeline是否正確?我應該如何在RTSP服務器上做到這一點?
我將appsrc的block屬性設置爲TRUE。如果我沒有將它設置爲true,它會使用所有內存,直到系統變得無響應。再一次,這裏的正確方法是什麼?
我目前使用push_sample推緩衝區到appsrcs。 push_sample和push_buffer有什麼區別?哪個更有效?
當不同掛載點上的2個客戶端正在觀看該流時,當其中一個客戶端斷開連接或停止流時,該流將其斷開。我檢查GstRTSPMedia上的新狀態信號以瞭解RTSP管道的狀態。顯然,這種方法行不通,這裏的正確答案是什麼?