Beispiel

Beispiel

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(oder n): 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(oder d): Dauer des Einfrierens bis zur Benachrichtigung festlegen (Standard ist 2 Sekunden).

Beispielausgabe

Siehe die lavfi.freezedetectMetadatenschlü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 freezedetectFilter:https://ffmpeg.org/ffmpeg-filters.html#freezedetect

Original-Patch:https://patchwork.ffmpeg.org/patch/10988/

verwandte Informationen