コマンド出力を複数のプログラムにパイプする方法

コマンド出力を複数のプログラムにパイプする方法

私はFFmpegを使用しており、TCPサーバーであるカスタムアプリケーションを作成しました。 ffmpegで冗長出力を使用しています。

私が望むのは、各出力に対して特定のポートでリッスンするプログラムを起動したいことです。たとえば、今何ができますか?

ffmpeg -i "stream_link" -codec copy -f mpegts - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

私のプログラムはffmpegからデータを取得し、サーバーの内部に保存します。これで、次の操作を実行できません。

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - \
    | myprogram -h 127.0.0.1 -p 12345 -f - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

私の考えでは、あなたが私を捕まえたと思います。 2つの異なるコンテナmpegts、flvを出力し、私のプログラムの2つのインスタンスを再度開こうとします。それではどうすればいいですか?

この質問はパイプにのみ関連しています。私はFFmpegを使って実際の例を挙げました。

ベストアンサー1

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f - | 
myprogram -h 127.0.0.1 -p 12345 -f -

したがって、私が正しく理解したら、これら2つのコマンドを1つにまとめようとしています。

mpegts滞在

ffmpeg -i "stream_link" -codec copy -f mpegts - |  
myprogram -h 127.0.0.1 -p 12345 -f - 

映画滞在

ffmpeg -i "stream_link"  -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f -

teeしたがって、上記の理解が正しい場合は、コマンドを使用してこれを行うことができると思います。この質問から詳細を得ることができます。ここ

したがって、コマンドを次のように書き直すことができます。

 ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
 tee >(myprogram -h 127.0.0.1 -p 12345 -f -) 
     >(myprogram -h 127.0.0.1 -p 12346 -f -) 

しかし、ユーザーとしてマックサイフ彼は自分の意見で次のように言及した。

ffmpeg2つのストリームがファイルに書き込まれています。 the と gompegts両方flv標準出力これが|パイプラインです。

したがって、ソリューションにはffmpeg2つの異なるファイルに書き込む必要があります。同様にffmpeg flv processing -o flvfile, mpegts processing -o mpegtsfile、2つのプロセスは両方の出力からデータを読み取ります。

そのプロセスと入力を受け取るプロセスの両方がffmpeg出力を解析して、意図したストリームの読み取りを開始するオフセットを知る必要があります。

したがって、このアプローチの問題は、tee冗長tee入力が可能であり、ffmpeg2つを使用できることです。ffmpeg

したがって、この問題を解決するより良い方法は、次の方法を使用することです。

{ { ffmpeg -i "stream_link"            #one input stream
        -codec copy -f flv /dev/fd/3   #duped and processed, out >&3
        -codec copy -f mpegts - |      #duped and processed, out >&1
        myprogram1 >&4                 #receives >&1 on <&0, out >&4
        } 3>&1 | myprogram2            #receives >&3 on <&0, out >&1
} 4>&1                                 #ensures both myprograms write to >&1

上記の方法を使用すると、ffmpeg出力を明示的に分割します。これは、実際にリンクを理解しているシステムで実行されているかどうかによって異なります/dev/fd/[num]

おすすめ記事