2012-09-15 42 views
1

我正在使用vlc媒體播放器通過互聯網連接到rtsp流。保持打開管道而不讀取它?

我只需要定期查看流,但每次建立連接都需要很長時間。

相反,我保持連接打開,vlc將輸出寫入命名管道作爲傳輸流。

然後vlc的第二個實例可以在需要時從管道讀取。

問題是,據我所知,命名管道不能被寫入,除非它打開閱讀。

爲了解決這個問題,當VLC的第二個實例不開我:

cat < $PIPE > /dev/null 

有沒有更好的方式來保持管道開啓寫比以這種方式使用其他的貓?

+0

「建立連接」 需要時間吧? 所以,如果你已經建立連接,讓VLC寫入命名管道(fifo)。填滿後,寫VLC將繼續等待(fifo已滿)。但conn已經建立。 然後使用2nd VLC從fifo讀取。你幾乎肯定會看到一個格利希。 (因爲時間明智,你會讀取1,2,3 .... 50,1000,1001,1002的等號)包51-999因爲VLC等待而丟失。 另一方面,通常不宜將管道打開,因爲它會在您的網絡上創建不必要的流量。 – anishsane

回答

0

如果管道未準備好寫入,則您沒有告知連接的VLC是幹什麼的。

如果它在發現管道尚未準備好寫入並繼續從連接讀取時放棄輸出,則可以簡單地打開管道但不讀取它。事情是這樣的:

while sleep 7d; do :; done < $PIPE & 

然後,當你開始玩的VLC,它將開始從管道讀,直到打VLC停止連接VLC會寫它。然而,如果連接的VLC在寫入管道時停頓,那麼通過上述設置,RTSP連接將最終超時,並且當正在播放的VLC從管道開始讀取時,連接的VLC將終止或將需要重新連接。 VLC也可能在寫入管道時發生超時。

在這種情況下,您可以從管道中讀取並丟棄其內容,直到正在播放的VLC到達,並在停止時恢復讀取。您可以讓多個進程打開一個管道,但數據只能從中讀取一次,即進程將競爭數據。

您可以通過在開始播放VLC之前暫停使用SIGSTOP的丟棄過程,並在它停止後使用SIGCONT恢復它,假設讀取管道的間隙不足以超時連接。

像這樣:

cat $FIFO > /dev/null & 
kill -SIGSTOP % 
vlc $FIFO 
kill -SIGCONT % 
相關問題