Extraiga cuadros del video transmitido por HTTP sin descargar el archivo completo

1

Quiero extraer un marco de una ubicación específica en un archivo de video. El archivo está ubicado en un servidor remoto y no quiero descargar todo. ¿Cómo puedo extraer un marco de una secuencia http mediante programación?

Puedo hacer lo que quiera con VLC con la GUI, pero no sé cómo hacerlo en la CLI, por ejemplo. Tal vez una forma de enviar encabezados de rango con el cli de VLC?

Estoy tratando de hacer esto en una máquina ubuntu sin cabeza

Ortix92
fuente

Respuestas:

3

ffmpeg también debería poder leer desde las URL. Simplemente especifique el desplazamiento en segundos o HH:MM:SS.msec formato para el -ss opción:

ffmpeg -i http://example.com/video.mp4 -ss 5 -frames:v 1 thumbnail.png

Esto funciona con otros contenedores HTML5 también.

Si está en una distribución de Linux, asegúrese de no instalar ffmpeg a través de apt-get install ffmpeg, pero compila tú mismo o descargar una compilación estática . Las versiones en los paquetes oficiales siempre están un poco desactualizadas y, dependiendo de la versión de Ubuntu, ni siquiera "ffmpeg" real.

slhck
fuente
¡Hasta ahora esto funciona! ¡Necesito hacer más pruebas! EDITAR: quité mi respuesta anterior porque creo que cometí un error grave entonces;)
Ortix92
1
Sí, puedo confirmar que esto funciona. Puse -ss por adelantado para la búsqueda de entrada y de algun modo funcionó. Estoy ejecutando esto con peerflix (aplicación de streaming torrent en el nodo) y simplemente funciona. No estoy seguro de si envía encabezados de rango o espera a que se descargue el trozo, ¡pero sin embargo hace lo que debe sin descargar el archivo completo!
Ortix92
Esto todavía descarga todo el archivo hasta ese punto. Si utiliza -ss 5, tarda unos segundos, ya que descarga los primeros 5 segundos del video, pero si lo usas -ss 500, toma unos minutos ya que descarga los primeros 500 segundos. ¿Hay alguna forma de descargar solo la parte necesaria del video?
user779159
1
@ user779159 Por lo general, si pones el -ss antes de -i, ffmpeg saltará a la parte solicitada sin descodificar primero. Pero con las descargas web, no creo que sea factible. El problema es que no existe una relación directa entre el desplazamiento de un archivo (en bytes) y el tiempo correspondiente, por lo que ffmpeg debe descargar el archivo completo antes de poder averiguar dónde omitir (en términos de desplazamiento de bytes) para una determinada marca de tiempo. . O tiene que decodificar hasta el punto que fue solicitado.
slhck
1
@ user779159 Ahora que lo mencionas, hay una cosa. Tal vez funcione más rápido si el archivo tiene sus metadatos de transmisión (el llamado átomo MOOV para archivos MP4) al principio. Este no es siempre el caso, es decir, no todos los archivos tienen esos metadatos al principio, y no estaba seguro de si ffmpeg lo usaría para descargas web. Pero me alegro de que haya funcionado!
slhck