2

vlc メディア プレーヤーを使用して、インターネット経由で rtsp ストリームに接続しています。

ストリームを定期的に表示するだけでよいのですが、毎回接続を確立するのに時間がかかりすぎます。

代わりに、接続を開いたままにし、vlc が出力をトランスポート ストリームとして名前付きパイプに書き込みます。

次に、vlc の 2 番目のインスタンスが必要に応じてパイプから読み取ることができます。

問題は、私が理解しているように、読み取り用に開いていない限り、名前付きパイプに書き込むことができないことです。

vlc の 2 番目のインスタンスが開いていないときにこの問題を回避するには、次のようにします。

    cat < $PIPE > /dev/null

この方法で cat を使用する以外に、書き込みのためにパイプを開いたままにしておくより良い方法はありますか?

4

1 に答える 1

1

パイプが書き込みの準備ができていない場合、接続している VLC が何をするかはわかりませんでした。

パイプが書き込みの準備ができていないことがわかったときに出力を破棄し、接続からの読み取りを続行する場合は、パイプを開くが読み取らないプロセスを単純に作成できます。このようなもの:

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

次に、再生中の VLC を開始すると、パイプからの読み取りが開始され、接続中の VLC は再生中の VLC が停止するまでパイプに書き込みます。

ただし、接続している VLC がパイプへの書き込み中に停止した場合、上記の設定では RTSP 接続が最終的にタイムアウトになり、再生中の VLC がパイプからの読み取りを開始すると、接続している VLC が終了するか、再接続する必要があります。VLC は、パイプへの書き込み時に単にタイムアウトすることもあります。

その場合、パイプから読み取って、再生中の VLC が到着するまでその内容を破棄し、停止したら読み取りを再開できます。複数のプロセスでパイプを開くことができますが、データはそこから 1 回だけ読み取られる場合があります。つまり、プロセスはデータを求めて競合します。

VLC の再生を開始する前に SIGSTOP で破棄プロセスを一時停止し、停止後に SIGCONT で再開することで、パイプの読み取りのギャップが接続をタイムアウトさせるほど大きくないと仮定して、これを行うことができます。

このような:

cat $FIFO > /dev/null &
kill -SIGSTOP %
vlc $FIFO
kill -SIGCONT %
于 2013-03-04T15:38:33.043 に答える