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.
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.
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
ffmpeg -i input.y4m -an -vcodec rawvideo -y output.avi
weil 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.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.
jiggunjer