Tengo un archivo de video y quiero obtener la cantidad de cuadros de video que contiene. Puedo usar ffmpeg
para obtener la duración del video y el FPS. Sin embargo, no puedo ver nada obvio para el número total de fotogramas.
En teoría, uno debería poder multiplicar la longitud (en segundos) por el FPS para obtener el número de fotogramas, pero en este caso la longitud (34.43 segundos) y la velocidad de fotogramas (29.97 fps) dan un no entero, lo que me hace Creo que estoy haciendo algo mal.
Necesito poder hacer esto en la línea de comando de una manera totalmente automática y no gráfica. También necesito que esto sea bastante exacto, y no una estimación (si eso es posible con archivos de video)
Intenté usar tcprobe
en algunos archivos. Para algunos archivos AVI funciona, pero para algunos archivos VOB, la salida de tcprobe no tiene el número de fotogramas. Me sale esta salida:
[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
aspect ratio: 4:3 (*)
frame rate: -f 29.970 [25.000] frc=4 (*)
PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
PTS=2199.2763, bitrate=192 kbps
-D 3 --av_fine_ms 20 (frames & ms) [0] [0]
Respuestas:
Esto es horrible, estúpido y lento, pero parece funcionar:
También funcionará correctamente en archivos truncados y secuencias sin procesar (es por eso que no obtiene nada para archivos .vob)
fuente
| tr ^M '\n'
y|tail -n 1
. Además, no hay espacio despuésframes=
no falla. (Tal vez algo ha cambiado en los últimos cuatro años.)ffprobe
se puede usar para obtener información sobre un archivo multimedia:Obtendrá detalles sobre la transmisión:
Busque
nb_frames
congrep
:Eso funciona para avi, mp4 y etc. Para algunos contenedores, no muestra un valor válido, por ejemplo, mpeg.
En ese caso, esto funciona
ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l
fuente
Publiqué esto en otra pregunta . Usando la
tcprobe
herramienta (deltranscode
paquete), el número de fotogramas se incluye en la información. Use el-i
interruptor para obtener un volcado de información del archivo:Tenga en cuenta que aquí se da el número de cuadros en dos líneas (segunda línea de salida y última línea de salida).
fuente
Descubrí que
mediainfo --fullscan inputfile | grep "Frame count"
funciona muy bien para la mayoría de los archivos.Los sistemas basados en Debian pueden instalarlo con
apt-get install mediainfo
Si obtiene 2 líneas en lugar de una de salida, la primera línea es la pista de video y la segunda línea es la pista de audio. Parece que esto ocurre en archivos con audio de velocidad de bits variable.
Probado en muestras .mkv, .m4v, .mp4, flv, vob y .avi a la fecha de edición.
Fuentes: ¿Cómo recuperar la información del archivo de video desde la línea de comandos en Linux? y pruebas bajo los sabores de Ubuntu.
Puede encontrar mediainfo disponible para su sistema operativo aquí.
fuente
Suma la duración. Podría ser más elegante con sed / awk y qué no.
De nuestras pruebas puedo decir que por ahora ha demostrado ser el mejor y más confiable. Obtiene un conteo de cuadros preciso y una duración exacta. Incluso con framerate variable que todas las otras herramientas como mediainfo parecen ir gaga.
fuente
Descubrí que la cantidad de fotogramas es en realidad el doble de la duración de fps * (no sé por qué, me encantaría saberlo).
En un guión mío, tengo:
Y sí, por alguna razón tengo que obtener la parte entera. No tiene sentido, pero este script siempre ha logrado convertir mis videos correctamente hasta ahora.
fuente
tcprobe
resultado en mi respuesta da el número de fotogramas como exactamente segundos * fps (redondeado hacia arriba). Espero que estés viendo un capricho de ffmpeg. ¿Has intentado analizar el archivo con otras herramientas para ver si muestran la misma cantidad de fotogramas?seconds*fps=1001.59
ytcprobe=1002
. Entonces, obviamente,tcprobe
me dice que no necesito multiplicar por dos. ¿Por qué entonces ffmpeg me da un número que es dos veces mayor en los registros cuando se está convirtiendo?Probado en Ubuntu.
melt
- melt fue pensado como una herramienta de prueba para el marco MLT, pero también es un potente editor de video orientado a la línea de comandos multipista. También podría usarse como un reproductor multimedia minimalista para archivos de audio y video.-consumer
id [: arg] [nombre = valor] *Establecer el consumidor (sumidero)
xml
- Establezca el consumidor (sumidero) en salida con formato xml<property name="length">nnnn</property>
- muestra el número de cuadros, dondennnn
se reemplaza por un número entero que es igual al número de cuadrosSi no tiene melt, puede instalarlo en Ubuntu y otros sistemas basados en Debian con
sudo apt-get install melt
fuente
mediainfo -fullscan filename
.Directamente con
mediainfo
, sin grep, sin esperas, sin nada:Para otra información ver
mediainfo --info-parameters
fuente
Puede hacerlo agregando y multiplicando los valores que obtiene de ffprobe.
Nota: ffprobe es parte de libav (avconv), la versión para Linux de ffmpeg.
Cuando haga esto, obtendrá el número de fotogramas por segundo y también la duración del clip.
Convierta la duración del clip a segundos y multiplique ese valor por el número de cuadros / segundo.
Recuerde redondear el número al más cercano.
fuente
ffprobe
no está disponible, pero hay algo que se llamaavprobe
enlibav-tools
(que también proporcionaavconv
). Pero a mi lado no imprime ningún número de cuadros, al menos no para los formatos que probé. Simplemente imprime, lo queavprobe -i
imprime también, y esto es solo algunas partes menores sobre el formato, lamentablemente. Incluso con-v debug
eso, solo me da algunas buenas propiedades de mi hardware y software instalado, pero ni una sola información interesante sobre el archivo / flujo a sondear. Tal vez se esconde en algunas de las innumerables opciones disponibles. ¿Quién sabe?ffmpeg
en los repositorios oficiales. El enlace que proporcionó correctamente lo indica: FFmpeg regresó en Ubuntu 15.04 "Vivid Vervet". . Sin embargo, la situación ahora cambió ya que 16.04 LTS está fuera.linux
rubí
fuente
El mejor método: (Directo calculando los parámetros correctos, confirmado por ffmpeg)
Cmd ->
Resultado ->
Cálculo ->
Prueba ->
aquí
Salida
fuente