Ich habe heute bemerkt, dass, wenn ich ffmpeg 4.0 stable verwende, um einige TS-Dateien in y4m oder ffv1 zu decodieren, es gelegentlich einige Frames überspringt. Meine Eingabedatei hat alle Frames in das Bild eingebrannt und ich extrahiere in regelmäßigen Abständen einige Frames. Manchmal funktioniert es ganz gut ohne übersprungene Frames, aber manchmal überspringt es ein oder zwei Frames. Ich verwende den folgenden Befehl, um meine Eingabe zu dekodieren:
ffmpeg -i input.ts -vsync 0 output.y4m
und ich extrahiere die Frames mit:
ffmpeg -ss xxx -i output.y4m -vframes 1 xxx.png
Ich ersetze xxx durch 0, 100, 200 usw. und manchmal sehe ich, dass 1-2-3 Frames ausgelassen werden, was sehr ärgerlich ist, da ich versuche, den PSNR danach auszuwerten, und dies die gesamte PSNR/SSIM-Auswertung durcheinander bringt.
[BEARBEITEN] Ich habe den Befehl ausgeführt, den @Gyan vorgeschlagen hat:
ffmpeg -v 99 -loglevel 99 -i test.ts \
-c:v rawvideo -vsync 0 \
-enc_time_base 1/1000 output.nut &> test.log
Und hier ist die Protokolldatei test.log
Y4M hat keine Zeitstempel, nur Framerate in seinem Header. Wenn Ihre Quelle also Schwankungen in der Framerate aufweist, sehen Sie eine Verschiebung des scheinbaren Zeitstempels in den Y4M.
z.B
n src y4m
0 0 0
1 0.04 0.04
2 0.07 0.08
3 0.12 0.12
4 0.21 0.16
5 0.24 0.20
6 0.27 0.24
...
Über einen langen Zeitraum können sich diese Störungen summieren. Hier ist Frame #6 in src bei TS von src #5 in Y4M.
Bearbeiten : Die Beispiel-TS-Datei enthält VFR-Zeitstempel.
Verwenden -c:v rawvideo -vsync 0 -vf setpts=N/FRAME_RATE/TB -an
und speichern Sie unter .nut
.
Georgi Stojanow
ffmpeg -i input.ts -c:v rawvideo -vsync 0 -enc_time_base 1/1000 output.nut
, aber leider verliere ich alle ~ 1000 Frames einen Frame, und dies ist ein ziemlich konstanter Verlust. Ich habe versucht, hinzuzufügen-an
, zu entfernen,-enc-time-base
aber es wird immer ein Bild alle ~ 1000 Bilder gelöscht. Tatsächlich funktioniert ffmpeg 3.2.4 in dieser Hinsicht besser und lässt bei derselben Eingabe keine Frames fallen.Gyan
Georgi Stojanow
Gyan
Georgi Stojanow
Gyan
Georgi Stojanow
Gyan
ffmpeg -i input.ts -vsync 0 output.y4m
und dannffmpeg -ss xxx -i output.y4m -vframes 1 xxx.png
undffmpeg -ss xxx -i input.ts -vframes 1 xxx-ts.png
zu vergleichen. Ich bekomme den gleichen Rahmen für 5-6 Werte, die ich versucht habe. Können Sie ein paarss
Werte identifizieren, die das Problem zeigen?Georgi Stojanow
ffmpeg -i test.ts -c:v rawvideo -vsync 0 -enc_time_base 1/1000 output.nut
Ich erhalte ungefähr einen Frame-Drop alle 1000 Frames. Sie können versuchen, die Frames alle 3000 Frames (60 Sek.) zu extrahieren. Ich glaube, die Gesamtdauer beträgt 5 Minuten, also können Sie -ss 0 - verwenden, um den ersten Frame in der Sequenz zu erhalten, und dann -ss 60, -ss 120, -ss 180, -ss 240, -ss 300. Mitffmpeg -i input.ts -vsync 0 output.y4m
I bekomme mehr zufällige Tropfen, manchmal ist es nur ein Frame für die gesamte Dauer, manchmal mehr. Bitte beachten Sie, dass die Datei tatsächlich eine Schleife durchläuft und ein Frame übersprungen wird: 14998.Georgi Stojanow
Gyan
Georgi Stojanow
ffmpeg -i input.ts -vsync 0 output.y4m
Befehl manchmal ein oder zwei Bilder übersprungen hat oder manchmal einwandfrei funktionierte. Wie haben Sie die Datei auch auf VFR und CFR überprüft? Gibt es einen Befehl in ffprobe, um danach zu suchen?Gyan
VFR:0.400005 (15185/22777) min: 1801 max: 3604)
. 40 % der Frames haben eine vom Standard abweichende Dauer. Alle sollten 1800 Einheiten in dieser Datei haben.Georgi Stojanow
detvfr
Filter ausprobiert und er hat mir die Abweichung angezeigt. Ich frage mich, warum die TS-Datei VFR hat, da ich sie mit ffmpeg aufgenommen habe und ich mir ziemlich sicher bin, dass die Eingabe CFR hat. Muss ich-re
in diesem Fall den Aufnahmebefehl verwenden, um die eingegebene Bildrate (Dauer) beizubehalten? Können Sie auch einen Aufnahmebefehl vorschlagen, der das Auffüllen mit Nullen (Stuffing) nicht aus dem TS schneidet?Gyan
-vsync cfr
und auch-r
, ob dieser Wert sich von den nominellen Eingabe-fps unterscheidet.Georgi Stojanow
Gyan
Georgi Stojanow
Gyan
Georgi Stojanow