sacar - La forma más rápida de extraer un fotograma específico de un video(PHP/ffmpeg/cualquier cosa)
como sacar imagenes de un video sin programas (1)
Tengo una página web, que (entre otras cosas) necesita extraer un marco específico de un video subido por el usuario. El usuario busca una parte particular de un .mp4 en el reproductor, luego hace clic en un botón, y una llamada ajax se dispara a un script php que toma el .mp4, y la hora exacta del video, y lo usa para extraer un marco de "miniatura".
Mi solución actual es usar el comando php exec
:
exec("ffmpeg -i $videoPath -ss $timeOffset -vframes 1 $jpgOutputPath");
... que funciona muy bien, excepto que es tan lento como la melaza. Supongo que ffmpeg es un poco demasiado para el trabajo, y podría ser mejor si utilizo las bibliotecas subyacentes o algo así ... sin embargo, no tengo idea de cómo hacerlo.
Lo ideal es que no tenga que instalar nada que requiera un verdadero "proceso de instalación" ... es decir, colocar un ejecutable en la carpeta con mi aplicación web está bien, pero prefiero no tener que ejecutar realmente un instalador. Además, la solución debe poder ejecutarse en Mac, Linux y Windows (aunque Linux es la principal prioridad).
¿Qué puedo hacer para acelerar este proceso?
Gracias.
Por supuesto, podrías codificar algo de C / C ++ y vincularlo a -lav *, básicamente creando una versión simplificada de ffmpeg solo para extraer marcos, y tal vez incluso hacerlo como una extensión de php (también yo no lo ejecutaría como el mismo usuario) , y mucho menos en el mismo proceso). Pero el resultado es muy poco probable que sea más rápido, ya que solo evitaría una sobrecarga de configuración y bifurcación, pero su problema probable es la descodificación, que seguiría siendo la misma.
En su lugar, primero debe considerar el uso de ffmpeg en el modo de búsqueda rápida (o modo híbrido rápido / preciso). Su wiki dice acerca de la búsqueda rápida:
El parámetro -ss debe especificarse antes de -i :
ffmpeg -ss 00:03:00 -i Underworld.Awakening.avi -frames: v 1 out1.jpg
Este ejemplo producirá un marco de imagen (out1.jpg) alrededor del tercer minuto desde el comienzo de la película. La entrada se analizará usando fotogramas clave, lo cual es muy rápido. El inconveniente es que también terminará la búsqueda en un fotograma clave, no necesariamente ubicado a la hora especificada (00:03:00), por lo que la búsqueda no será tan precisa como se esperaba.
La búsqueda rápida es menos precisa, pero muchísimo más rápida, ya que ffmpeg no necesitará decodificar (la mayoría de) la película durante la búsqueda, mientras que el modo híbrido rápido / preciso es un buen compromiso. Lea la página wiki para ver todas las opciones disponibles.
Editar 14/06/10 :
A partir de FFmpeg 2.1, cuando se transcodifica con ffmpeg (es decir, no copia continua), -ss ahora es preciso incluso cuando se usa como una opción de entrada. El comportamiento anterior se puede restaurar con la opción -noaccurate_seek. (fuente)
Entonces con 2.1+, la búsqueda "híbrida" ya no debería ser requerida para obtener resultados precisos cuando se trata de recodificar (y guardar en .jpeg
es una recodificación). Es suficiente hacer la búsqueda rápida habitual ( -ss ... -i ...
) en lugar de la búsqueda lenta ( -i ... -ss ...
).