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
(oun
): 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
(oud
): Defina a duração do congelamento até a notificação (o padrão é 2 segundos).
Exemplo de saída
Consulte as lavfi.freezedetect
chaves 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 freezedetect
filtro:https://ffmpeg.org/ffmpeg-filters.html#freezedetect
Remendo original:https://patchwork.ffmpeg.org/patch/10988/