Ich leite Roh-YUV444-Frames (640 x 480) aus einem C++-Programm heraus über stdout an ffmpeg weiter (Pipe-Format: Pipe<-Y<-U<-V, jeweils ganze Frames). ffmpeg kodiert sie mit h.264 und streamt das Video über UDP an eine IP meiner Wahl.
Wenn ich nicht streame und das Video auf dem Aufnahmegerät als -mp4-Datei mit ffmpeg speichere, funktioniert alles - Aber wenn ich über das Netzwerk streame und versuche, es in VLC zu empfangen, wird der Stream empfangen und der Wiedergabetimer unter dem Videobildschirm läuft,aber das Bild ist schwarz, es wird nichts vom Video angezeigt.Außerdem habe ich ein paar Knistergeräusche bei meiner Audioausgabe. Das Rohvideo hat keine Audiospur.
Meine ffmpeg-Einstellungen sind wie folgt:
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
in VLC (GUI) verwende ich einfach „open network stream“ mit udp://@:20001. Der Port ist offen, ich habe ihn mit einem einfachen Dummy-Sender/Empfänger getestet. Fast dieselben CLI-Argumente für die Videoaufzeichnung führen beim Schreiben in eine Datei und beim Herunterladen zu einem perfekt abspielbaren Video:
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
Wenn ich versuche, dasselbe aufgenommene Video zu streamen mit
ffmpeg -i video.mp4 -v 0 -vcodec mpeg4 -f mpegts udp://192.168.150:20001
Ich bekomme wieder einen schwarzen Bildschirm, wie oben.
Die VLC-Protokollausgabe identifiziert meinen Stream als MP3, also liegt es vielleicht an der Streamtyperkennung. Aber warum?
Hier sind dieffmpeg-Konsolenausgabeund dasVLC-Protokoll.
Was mache ich falsch?
PS: Diese Frage wurde von Stack Overflow hierher verschoben, da sie keine Antworten erhielt. Alte unbeantwortete Duplikate wurden gelöscht.
Antwort1
Obwohl das zugrunde liegende Problem nicht behoben wurde, haben mir die Hinweise von @Gyan geholfen, mein Problem zu lösen. Mit anderen Playern (PotPlayer) oder einer älteren Version von VLC funktionierte die Stream-Anzeige, und das war alles, was ich brauchte.