example video ffmpeg ffprobe

video - example - Usando FFMPEG: ¿Cómo hacer una detección de cambio de escena? con código de tiempo?



ffmpeg php example (2)

Basado en este artículo parece que es posible usar FFMPEG para detectar cambios de escena en videos: http://www.luckydinosaur.com/u/ffmpeg-scene-change-detector

Ahora tengo un video que muestra el texto de un libro y cuando se habla el texto (palabra o frase) se resalta. Algo como este audiolibro: https://youtu.be/lA7L6ZNVKjc

Necesito saber la marca de tiempo cuando el texto se resalta (por lo tanto, cambio de escena), esto me permitirá agregar etiquetas de marca de tiempo en mi video de YouTube, por lo que es más fácil para los oyentes navegar a través del audiolibro.

¿Cuál es la línea de comando mágica que haría esto?

¡Muchas gracias!


No tengo el representante para publicar un comentario sobre la respuesta anterior, pero quería señalar que el grep publicado por @ckoehn y @keypulsations solo captará las marcas de tiempo que son coma flotante. Para captar las marcas de tiempo de punto flotante y entero, use la siguiente expresión regular

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E ''[0-9]+(?:/.[0-9]*)?'' -o > timestamps


La combinación del filtro de escena (para detectar cambios de escena) y el filtro de showinfo debe lograr lo que desea:

ffmpeg -i input.flv -filter:v "select=''gt(scene,0.4)'',showinfo" -f null - 2> ffout

Este comando extrae todos los fotogramas que difieren del fotograma anterior en más de ( gt ) 0.4 (en una escala de 0 a 1 ). Para estos marcos, la información se imprime ( showinfo ) como esta

[Parsed_showinfo_1 @ 0x2d85e60] n: 0 pts:2537204 pts_time:2.5372 pos: 2998114 fmt:rgb24 sar:1/1 s:1920x1200 i:P iskey:1 type:I checksum:5616582E plane_checksum:[5616582E]

Ahora solo tienes que extraer la marca de tiempo. Creo que estás interesado en pts_time . Podrías hacerlo así:

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps

Esto le dará la lista de todas las marcas de tiempo:

2.5372 4.37799 6.65301 8.09344

Para que este enfoque funcione, debe tener una versión de FFmpeg que implemente la detección de escena. Además, debe seleccionar un valor adecuado para el umbral ( 0.4 en el primer comando). Puede intentar encontrar un umbral óptimo extrayendo cuadros para diferentes umbrales (y luego examinar los marcos manualmente) como este

ffmpeg -i input.flv -filter:v "select=''gt(scene,0.1)'',showinfo" -vsync 0 frames/%05d.jpg

Solo para aclarar: grep [0-9.]* No excluye enteros como se afirma en otra respuesta. Coincide con cualquier secuencia de caracteres que consta de dígitos y períodos, pero también coincide con no números como ''4.4.4''. Sin embargo, ffmpeg no debería producir tales sellos de tiempo mal formados.