
Unbescholtener Bürger zurück mit einer weiteren FFmpeg-Frage. Mein Ziel ist es, eine Instanz von FFmpeg laufen zu lassen, die einen MPEG-Transportstrom über RTP empfängt, beliebige Operationen am empfangenen Strom ausführt, wie Transkodierung oder Filterung, und dann den geänderten Transportstrom über RTP weiterleitet.
Allerdings bekomme ich es nicht einmal in der einfachsten Konfiguration zum Laufen: Ich habe eine .ts-Datei, die ein einzelnes Programm enthält, das aus einem Video- und einem Audiostream besteht. Ich verwende eine Instanz von FFmpeg, um diese Datei auf den lokalen Host zu streamen:
ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003
Mit ffplay überprüfe ich, ob dies korrekt funktioniert:
ffplay -i rtp://127.0.0.1:5003
Das Ergebnis sieht gut aus, hört sich gut an und verursacht keine Fehlermeldungen auf der Konsole.
Jetzt versuche ich, eine weitere FFmpeg-Instanz dazwischen zu setzen, und es geht bergab. Ich möchte nur, dass FFmpeg den Stream von Port 5003 auf Port 5005 kopiert, ohne weitere Verarbeitung oder Transkodierung:
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 auf dieser Konsole viele wiederkehrende Fehlermeldungen, und wenn ich den Stream auf Port 5005 mit ffplay überwache, treten viele Artefakte, Störungen und Aussetzer auf. Die Konsolenausgabe sieht größtenteils 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... irgendeine Idee, was schiefgelaufen ist und wie man es beheben kann? Ein Blick auf den Ressourcenmonitor zeigt keine hohe CPU-, Speicher- oder Netzwerklast an.
Antwort1
Mein Problem war also offensichtlich das -re
Flag im Befehl, das die Pass-Through-FFmpeg-Instanz startet.
Wenn ich vorher in die offizielle Dokumentation geschaut hätte, hätte ich diese Frage nicht stellen müssen:
-re
(Eingang)Liest Eingaben mit nativer Bildrate. Wird hauptsächlich verwendet, um ein Grab-Gerät oder einen Live-Eingabestream zu simulieren (z. B. beim Lesen aus einer Datei). Sollte nicht mit tatsächlichen Grab-Geräten oder Live-Eingabestreams verwendet werden (wo es zu Paketverlusten führen kann).
http://ffmpeg.org/ffmpeg.html#Erweiterte Optionen
Und genau das ist mir passiert.