FFMPEG dupliziert den ersten Frame beim Codieren

Die Verwendung von ffprobe zeigt, dass beide Videos die gleiche Framezahl haben, aber wenn ich die Frames als Bilder extrahiere, hat das komprimierte am Anfang einen zusätzlichen Frame (der nur der duplizierte erste Frame ist).

Dies bereitet mir viele Probleme, da ich die Frame-Unterschiede zwischen den beiden Videos berechnen muss und ein zusätzliches Frame alles asynchron macht.

Eingang

ffmpeg -i "720p50_mobcal_ter.avi" -an -f mpeg2video -y "720p50_mobcal_ter.mpg"

Ausgabe

ffmpeg version N-76684-g1fe82ab Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55.  6.100 / 55.  6.100
  libavcodec     57. 15.100 / 57. 15.100
  libavformat    57. 14.100 / 57. 14.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 15.100 /  6. 15.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, avi, from '720p50_mobcal_ter.avi':
  Metadata:
    encoder         : Lavf57.14.100
  Duration: 00:00:10.08, start: 0.000000, bitrate: 552974 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1280x720, 554059 kb/s, SAR 1:1 DAR 16:9, 50 fps, 50 tbr, 50 tbn, 50 tbc
Output #0, mpeg2video, to '720p50_mobcal_ter.mpg':
  Metadata:
    encoder         : Lavf57.14.100
    Stream #0:0: Video: mpeg2video, yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 50 fps, 50 tbn, 50 tbc
    Metadata:
      encoder         : Lavc57.15.100 mpeg2video
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg2video (native))
Press [q] to stop, [?] for help
frame=   41 fps=0.0 q=31.0 size=     984kB time=00:00:00.78 bitrate=10330.5kbits/frame=   80 fps= 78 q=31.0 size=    1323kB time=00:00:01.56 bitrate=6948.1kbits/frame=  124 fps= 80 q=31.0 size=    1725kB time=00:00:02.44 bitrate=5790.0kbits/frame=  168 fps= 81 q=31.0 size=    2084kB time=00:00:03.32 bitrate=5142.8kbits/frame=  212 fps= 81 q=31.0 size=    2482kB time=00:00:04.20 bitrate=4841.4kbits/frame=  255 fps= 82 q=31.0 size=    2840kB time=00:00:05.06 bitrate=4597.2kbits/frame=  296 fps= 82 q=31.0 size=    3133kB time=00:00:05.88 bitrate=4364.5kbits/frame=  338 fps= 82 q=24.8 size=    3453kB time=00:00:06.72 bitrate=4209.2kbits/frame=  382 fps= 82 q=31.0 size=    3723kB time=00:00:07.60 bitrate=4013.4kbits/frame=  426 fps= 83 q=31.0 size=    4005kB time=00:00:08.48 bitrate=3869.1kbits/frame=  470 fps= 83 q=24.8 size=    4276kB time=00:00:09.36 bitrate=3742.5kbits/frame=  504 fps= 83 q=31.0 Lsize=    4469kB time=00:00:10.06 bitrate=3639.3kbits/s
video:4469kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

Meine aktuelle Lösung besteht darin, das komprimierte Video zu trimmen, bevor die Unterschiede berechnet werden, aber dies beinhaltet eine Neucodierung und Qualitätsverlust, wodurch die Ergebnisse unbrauchbar werden.

Um die Frage etwas vollständiger zu machen, hier sind die Befehle, die ich verwende, um die Unterschiede zu trimmen und zu berechnen:

ffmpeg -y -i "720p50_mobcal_ter.mpg" -an -f mpeg2video -vf select=gte(n\,1) "cut-720p50_mobcal_ter.mpg"


ffmpeg -y -i "720p50_mobcal_ter.avi" -i "cut-720p50_mobcal_ter.mpg" -filter_complex "blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg"

Die Frage ist: Wie kann ich vermeiden, dass der erste Frame dupliziert wird? Wenn dies nicht vermieden werden kann, gibt es eine Möglichkeit, es zu entfernen, ohne das Video neu zu codieren, oder es einfach zu überspringen, während die Unterschiede berechnet werden?

BEARBEITEN:

Nach der Antwort von @ Mulvya habe ich seinen Vorschlag ausprobiert, aber es funktioniert irgendwie nicht. Ich verstehe, dass es schwierig ist, das Problem zu finden, ohne die Videodatei zu haben, also poste ich stattdessen einen Screenshot mit den ersten 4 Frames jedes Videos, um Ihnen zu helfen, mein Problem zu visualisieren.

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, hat das komprimierte Video einen grauen dritten Frame, der die Unterschiede durcheinander bringt.

Der Grund für diese Bearbeitung ist, dass ich sicher bin, dass die gegebene Antwort funktionieren sollte, zumindest nach meinem Verständnis der Funktionsweise von Filterzuordnungen, aber es funktioniert wahrscheinlich nicht, weil das Problem hier nicht das ist, was ich dachte.

Ich erwarte ein fast schwarzes drittes Bild auf dem Unterschiedsvideo und nicht das Vollbild des Originals.

EDIT 2: Habe die neue Lösung ausprobiert, die beim ersten Mal irgendwie funktioniert hat, aber jetzt nicht mehr.

Hier ist die Liste der Befehle, die ich verwende, das Ergebnis ist immer noch das gleiche wie auf dem Screenshot, aber jetzt hat sich das Problem auf den zweiten Frame verschoben, anstatt auf den dritten (im Grunde ist es so, wie der Screenshot ohne die 00000.png wäre Rahmen)

ffmpeg  -i "720p50_mobcal_ter.avi" -an -f mpeg1video -y "compressed.mpg" 
ffmpeg  -i "720p50_mobcal_ter.avi" -vf fps=50 "original\image-%05d.png"
ffmpeg  -i "compressed.mpg" -vf fps=50 "compressed\image-%05d.png"
ffmpeg  -y -i "720p50_mobcal_ter.avi" -i "compressed.mpg" -filter_complex "[1:v]trim=start_frame=1,setpts=PTS-STARTPTS[cut];[0:v][cut]blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg" 
ffmpeg  -i "differences.mpg" -vf fps=50 "differences\image-%05d.png"

Das Quellvideo, das ich verwende, ist hier, nur für den Fall, dass Sie es selbst ausprobieren möchten.

Ich hatte dieses Problem auch mit der neuesten Zeranoe-Binärdatei. Gelöst durch Verwendung des fps-Filters für die Ausgabe.

Antworten (2)

Sie können diesen ersten Frame während des Berechnungsprozesses überspringen.

ffmpeg -y -i "720p50_mobcal_ter.avi" -i "720p50_mobcal_ter.mpg" -filter_complex "[1:v]trim=start_frame=1,setpts=PTS-STARTPTS[cut];[0:v][cut]blend=all_mode=difference,hue=s=0" -c:v libx264 -crf 18 -c:a copy "differences.mpg"

Bearbeiten : Wie gewünscht, fügte ich die Befehle hinzu, mit denen ich das Verhalten reproduzierte, aber das Problem trat nicht auf.

ffmpeg -i "720p50_mobcal_ter.y4m" -c:v copy "720p50_mobcal_ter.avi"
ffmpeg -i "720p50_mobcal_ter.avi" -c:v mpeg2video "720p50_mobcal_ter.mpg"
ffmpeg -i "720p50_mobcal_ter.avi" -i "720p50_mobcal_ter.mpg" -filter_complex blend=all_mode=difference,hue=s=0 -c:v libx264 -crf 18 "differences.mp4"

ffmpeg -i "720p50_mobcal_ter.avi" avi\frames%03d.png
ffmpeg -i "720p50_mobcal_ter.mpg" mpg\frames%03d.png

Mein ffmpeg-Build aus Zeranoe

ffmpeg version N-77380-g2dba040 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 11.100 / 55. 11.100
  libavcodec     57. 18.100 / 57. 18.100
  libavformat    57. 20.100 / 57. 20.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 21.100 /  6. 21.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Obwohl ich sicher bin, dass Ihre Antwort richtig ist, hat sie aus bestimmten Gründen nicht funktioniert, und ich habe die Frage aktualisiert, um weitere Details bereitzustellen, die möglicherweise nützlich sind.
Setzen Sie den PTS gemäß dem bearbeiteten Befehl zurück und überprüfen Sie ihn.
Ich habe das OP erneut bearbeitet, da ich immer noch Probleme habe.
Werde mir das Quellvideo anschauen.
Kann Problem nicht reproduzieren. Rahmen hier ausgerichtet. Siehe datafilehost.com/d/8b05aaaf
Was ist Ihr Befehl zum Generieren von AVI?
Es ist schon eine Weile her, aber ich glaube, ich habe dieses verwendet, ffmpeg -i input.y4m -an -vcodec rawvideo -y output.aviweil ich es unkomprimiert haben muss. Ich bin mir nicht sicher, aber vielleicht hilft es, wenn Sie den Befehl posten, mit dem Sie die .avi-Datei erstellt haben.
ffmpeg -i input.y4m -c:v copy output.avi-- Der Eingangsvideostrom ist bereits Rohvideo, daher ist keine AVI-Generierung erforderlich. Versuchen Sie es mit einem neueren Build von ffmpeg.
Das AVI mit Ihrem Befehl neu erstellt und auf den neuesten Build aktualisiert, immer noch keine Unterschiede zu den vorherigen Ergebnissen. Können Sie bitte alle Befehle schreiben, die Sie verwendet haben, um zu Ihrem Unterschiedsvideo zu gelangen? Vielleicht stimmt etwas nicht, wie ich das Video komprimiere.
Ich bekomme identische Ergebnisse mit einem mpeg1video transkodieren und vergleichen wie mit mpeg2video
Ich habe keine Ahnung, warum das passiert, aber mit Ihrem Codierungsbefehl funktioniert alles einwandfrei, also akzeptiere ich Ihre Antwort.

Ich habe dieses Problem weiter analysiert und festgestellt, dass es sogar mit der Version 2.8.1 von ffmpeg existiert. Aber überraschenderweise wird das erste Bild nur dupliziert, während das Eingangsvideo mit 23,976 fps transkodiert wird!!! Wenn ich ein Video mit anderen fps (24, 25, 29,976, 30) transkodiere, scheinen die Initialen-Frames in Ordnung zu sein.