¿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
(on
): 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
(od
): establece la duración de la congelación hasta la notificación (el valor predeterminado es 2 segundos).
Salida de ejemplo
Consulte las lavfi.freezedetect
claves 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 freezedetect
filtro:https://ffmpeg.org/ffmpeg-filters.html#freezedetect
Parche original:https://patchwork.ffmpeg.org/patch/10988/