Gibt es eine Möglichkeit, eingefrorene Videos mit ffmpeg zu erkennen? Ich muss nur wissen, ob es ziemlich große Bereiche mit eingefrorenem Video gibt, sagen wir 10 Sekunden oder mehr.
Ich bin vertraut mit demschwarzdetectFilter.
Vielleicht könnten Sie zuerst benachbarte Frames differenzieren und dann mit Blackdetect feststellen, ob sich die Differenz nicht geändert hat? Ich bin mir jedoch nicht sicher, wie ich die Differenzierung durchführen soll.
Antwort1
Verwenden Sie dieEinfriererkennungFilter. Es ist neuer als der 4.1-Release-Zweig, also verwenden Sie einen Build aus dem aktuellen Git-Master-Zweig. SieheFFmpeg herunterladenSeite mit Links zu Builds für Linux, macOS und Windows.
Beispiel
ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2" -map 0:v:0 -f null -
Optionen
noise
(odern
): Rauschtoleranz festlegen. Kann in dB angegeben werden (falls „dB“ an den angegebenen Wert angehängt wird) oder als Differenzverhältnis zwischen 0 und 1. Der Standardwert ist -60 dB oder 0,001.duration
(oderd
): Dauer des Einfrierens bis zur Benachrichtigung festlegen (Standard ist 2 Sekunden).
Beispielausgabe
Siehe die lavfi.freezedetect
Metadatenschlüssel in der Konsolenausgabe.
ffmpeg version N-93663-ga42e761b96 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 8.3.0 (GCC)
configuration:
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 52.100 / 58. 52.100
libavformat 58. 27.103 / 58. 27.103
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 49.100 / 7. 49.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'freeze.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:28.99, start: 0.000000, bitrate: 1324 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 115:87 DAR 1840:783], 1322 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
handler_name : VideoHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.27.103
Stream #0:0(und): Video: wrapped_avframe, yuv420p, 1280x720 [SAR 115:87 DAR 1840:783], q=2-31, 200 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc58.52.100 wrapped_avframe
[freezedetect @ 0x55f7a55c9800] lavfi.freezedetect.freeze_start: 10.01
[freezedetect @ 0x55f7a55c9800] lavfi.freezedetect.freeze_duration: 13.1381x
[freezedetect @ 0x55f7a55c9800] lavfi.freezedetect.freeze_end: 23.1481
frame= 695 fps=0.0 q=-0.0 Lsize=N/A time=00:00:28.98 bitrate=N/A speed= 40x
video:364kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Ausgabe der Ergebnisse in eine Datei
Sie können den Metadatenfilter kombinieren, um nur die Freeze-Informationen zu erhalten:
ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2,metadata=mode=print:file=freeze.txt" -map 0:v:0 -f null -
Was dazu führt freeze.txt
:
frame:288 pts:288288 pts_time:12.012
lavfi.freezedetect.freeze_start=10.01
frame:555 pts:555555 pts_time:23.1481
lavfi.freezedetect.freeze_duration=13.1381
lavfi.freezedetect.freeze_end=23.1481
Sehen Sie sich dieDokumentation zum Metadatenfilterfür weitere Optionen.
Antwort2
Seit einigen Monaten gibt es einen freezedetect
Filter:https://ffmpeg.org/ffmpeg-filters.html#freezedetect
Original-Patch:https://patchwork.ffmpeg.org/patch/10988/