私は、stdout を使用して C++ プログラム内から ffmpeg に生の YUV444 640x480 フレームをパイプしています (パイプ形式: pipe<-Y<-U<-V それぞれフレーム全体)。ffmpeg はそれらを h.264 を使用してエンコードし、UDP 経由で選択した IP にビデオをストリーミングします。
ストリーミングしておらず、ffmpegを使用して録画デバイスにビデオを-mp4ファイルとして保存している場合は、すべて機能しますが、ネットワーク経由でストリーミングしてVLCで受信しようとすると、ストリームが受信され、ビデオ画面の下の再生タイマーが実行されます。しかし、画像は黒く、ビデオは何も表示されません。また、オーディオ出力にパチパチという音が聞こえます。生のビデオにはオーディオ トラックがありません。
私のffmpeg設定は次のとおりです。
ffmpeg -y -loglevel verbose -f rawvideo -r 25 -c:v rawvideo -pix_fmt yuv444p -s 640x480 -i - -c:v libx264 -preset superfast -framerate 25 -f mpegts udp://192.168.150.1:20001
VLC (GUI) では、udp://@:20001 で「ネットワーク ストリームを開く」を使用します。ポートは開いており、単純なダミーの送信者/受信者でテストしました。ビデオ録画用のほぼ同じ CLI 引数により、ファイルに書き込んでダウンロードするときに、完全に再生可能なビデオが得られます。
ffmpeg -y -loglevel verbose -f rawvideo -r 25 -c:v rawvideo -pix_fmt yuv444p -s 640x480 -i - -c:v libx264 -preset superfast -framerate 25 video.mp4
同じ録画ビデオをストリーミングしようとすると
ffmpeg -i video.mp4 -v 0 -vcodec mpeg4 -f mpegts udp://192.168.150:20001
上記のように、再び黒い画面が表示されます。
VLC ログ出力ではストリームが mp3 として識別されているので、ストリーム タイプの認識に問題がある可能性があります。しかし、なぜでしょうか?
ここではffmpeg コンソール出力そしてそのVLCログ。
何が間違っているのでしょうか?
PS: この質問は回答が得られなかったため、Stack Overflow からこちらに移動しました。古い未回答の重複質問は削除されました。
答え1
根本的な問題は解決されていませんが、@Gyans のヒントが私の問題を解決するのに役立ちました。他のプレーヤー (PotPlayer) または古いバージョンの VLC を使用すると、ストリーム表示が機能するようになりました。これで必要なことはすべて完了です。