Ejemplo

Ejemplo

¿Existe alguna forma de detectar videos congelados con ffmpeg? Sólo necesito saber si hay regiones bastante grandes de vídeo congelado, digamos 10 segundos o más.

Estoy familiarizado con eldetectar negrofiltrar.

¿Tal vez podrías diferenciar primero los cuadros adyacentes y luego usar blackdetect para saber si la diferencia no ha cambiado? Sin embargo, no estoy seguro de cómo realizar la diferencia.

Respuesta1

Utilizar eldetección de congelaciónfiltrar. Es más reciente que la rama de la versión 4.1, así que use una compilación de la rama maestra de git actual. VerDescargar FFmpegpágina para enlaces a compilaciones para Linux, macOS y Windows.

Ejemplo

ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2" -map 0:v:0 -f null -

Opciones

  • noise(o n): establece la tolerancia al ruido. Se puede especificar en dB (en caso de que se agregue "dB" al valor especificado) o como una relación de diferencia entre 0 y 1. El valor predeterminado es -60 dB o 0,001.

  • duration(o d): establece la duración de la congelación hasta la notificación (el valor predeterminado es 2 segundos).

Salida de ejemplo

Consulte las lavfi.freezedetectclaves de metadatos en la salida de la consola.

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

Enviar los resultados a un archivo

Puedes combinar el filtro de metadatos para obtener solo la información de congelación:

ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2,metadata=mode=print:file=freeze.txt" -map 0:v:0 -f null -

Lo que resulta en 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

Ver eldocumentación del filtro de metadatospara más opciones.

Respuesta2

Desde hace unos meses, hay un freezedetectfiltro:https://ffmpeg.org/ffmpeg-filters.html#freezedetect

Parche original:https://patchwork.ffmpeg.org/patch/10988/

información relacionada