Exemplo

Exemplo

Existe uma maneira de detectar vídeo congelado com ffmpeg? Só preciso saber se há regiões grandes de vídeo congelado, digamos 10 segundos ou mais.

Estou familiarizado com odetecção negrafiltro.

Talvez você possa primeiro diferenciar os quadros adjacentes e depois usar o blackdetect para saber se a diferença não mudou? Não tenho certeza de como fazer a diferença.

Responder1

Use odetecção de congelamentofiltro. É mais recente que o branch de lançamento 4.1, então use uma compilação do branch git master atual. VerBaixar FFmpegpágina para links para compilações para Linux, macOS e Windows.

Exemplo

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

Opções

  • noise(ou n): Defina a tolerância ao ruído. Pode ser especificado em dB (caso "dB" seja anexado ao valor especificado) ou como uma relação de diferença entre 0 e 1. O padrão é -60dB ou 0,001.

  • duration(ou d): Defina a duração do congelamento até a notificação (o padrão é 2 segundos).

Exemplo de saída

Consulte as lavfi.freezedetectchaves de metadados na saída do console.

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

Enviando os resultados para um arquivo

Você pode combinar o filtro de metadados para obter apenas as informações de congelamento:

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

O que resulta em 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

Veja odocumentação do filtro de metadadospara mais opções.

Responder2

Há alguns meses, existe um freezedetectfiltro:https://ffmpeg.org/ffmpeg-filters.html#freezedetect

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

informação relacionada