FFmpeg-Passthrough des MPEG-Transportstreams verursacht Fehler und Störungen im Stream

2547
UnbescholtenerBuerger

Unbescholtener Bürger mit einer weiteren FFmpeg-Frage zurück. Mein Ziel ist es, dass eine Instanz von FFmpeg ausgeführt wird, die einen mpeg-Transportstrom über RTP empfängt, auf dem empfangenen Strom beliebige Operationen wie Transcoding oder Filterung ausführt und den geänderten Transportstrom dann über RTP weiterleitet.

Ich verstehe es jedoch nicht einmal in der einfachsten Konfiguration: Ich habe eine .ts-Datei, die ein einzelnes Programm enthält, das aus einem Video- und einem Audiostrom besteht. Ich verwende eine Instanz von FFmpeg, um diese Datei an localhost zu streamen:

ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003 

Mit ffplay bestätige ich, dass dies korrekt funktioniert:

ffplay -i rtp://127.0.0.1:5003 

Das Ergebnis sieht gut aus, klingt gut und verursacht keine Fehlermeldungen auf der Konsole.

Jetzt versuche ich eine andere FFmpeg-Instanz dazwischen zu setzen und es geht bergab. Ich möchte nur, dass FFmpeg den Stream von Port 5003 nach Port 5005 kopiert, ohne dass er weiter verarbeitet oder umcodiert wird:

ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005 

Ich bekomme viele wiederkehrende Fehlermeldungen auf dieser Konsole, und wenn ich den Stream an Port 5005 mit ffplay überwache, entstehen viele Artefakte, Störungen und Aussetzer. Die Konsolenausgabe sieht zum größten Teil so aus:

... Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000': Duration: N/A, start: 1.400022, bitrate: N/A Program 1  Metadata: service_name : Service01 service_provider: FFmpeg Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005': Metadata: encoder : Lavf58.2.102 Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.48 bitrate= 0.0kbits/s speed=0.957x frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.01 bitrate= 0.0kbits/s speed=0.991x frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.53 bitrate= 0.0kbits/s speed=1.01x  frame= 1 fps=0.5 q=-1.0 size= 57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x  frame= 17 fps=6.7 q=-1.0 size= 83kB time=00:00:02.54 bitrate= 267.6kbits/s speed= 1x  frame= 32 fps= 11 q=-1.0 size= 121kB time=00:00:03.04 bitrate= 324.9kbits/s speed= 1x  [rtp @ 0x3db64c0] max delay reached. need to consume packet [rtp @ 0x3db64c0] RTP: missed 50 packets [rtp @ 0x3db64c0] PES packet size mismatch frame= 37 fps= 10 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame= 37 fps=9.1 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x  [rtp @ 0x3db64c0] max delay reached. need to consume packet [rtp @ 0x3db64c0] RTP: missed 1 packets [rtp @ 0x3db64c0] PES packet size mismatch [rtp @ 0x3db64c0] max delay reached. need to consume packet [rtp @ 0x3db64c0] RTP: missed 1 packets frame= 47 fps= 10 q=-1.0 size= 150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x ... 

Also ... eine Idee, was schief gelaufen ist und wie man es reparieren kann? Ein Blick auf den Ressourcenmonitor weist nicht auf eine hohe CPU-, Speicher- oder Netzwerklast hin.

0
Können Sie eine .ts-Datei angeben? vor 6 Jahren 0
Ich könnte, aber es wäre nicht legal, denke ich. Ich habe Bronski Beat - Smalltown Boy von YT heruntergeladen und mit FFmpeg in .ts konvertiert. Egal, das ist egal, weil ich den Täter tatsächlich gefunden habe. UnbescholtenerBuerger vor 6 Jahren 0

1 Antwort auf die Frage

0
UnbescholtenerBuerger

Anscheinend war mein Problem also das -reFlag im Befehl, mit dem die Pass-Through-Instanz von FFmpeg gestartet wird.

Wenn ich vorher die offiziellen Unterlagen gelesen hätte, hätte ich diese Frage nicht stellen müssen:

-re (Eingang)

Lesen Sie die Eingabe mit der nativen Framerate. Wird hauptsächlich zum Simulieren eines Greifers oder eines Live-Eingabestreams (z. B. beim Lesen aus einer Datei) verwendet. Sollte nicht mit tatsächlichen Greifgeräten oder Live-Eingabeströmen verwendet werden (wo es zu Paketverlusten kommen kann).

http://ffmpeg.org/ffmpeg.html#Advanced-options

Und genau das ist mir passiert.