¿Alguien sabe cómo obtener la cantidad de fotogramas totales de un archivo de video usando ffmpeg? La salida de renderizado de ffmpeg muestra el fotograma actual y necesito el recuento de fotogramas para calcular el progreso en porcentaje.
112
Respuestas:
Nota: La presencia de una lista de edición en MP4 / M4V / M4A / MOV puede afectar su número de fotograma. Consulte Editar listas a continuación.
ffprobe: consulta el contenedor
N/A
. Consulte los otros métodos que se enumeran a continuación.ffprobe: cuenta el número de fotogramas
-skip_frame nokey
opción de contar solo los fotogramas clave.ffmpeg: cuenta el número de fotogramas
Si no lo tiene
ffprobe
, puede usarffmpeg
en su lugar:frame=
cerca del final de la salida de la consola.-discard nokey
opción de entrada (antes-i
) para contar solo los fotogramas clave.Editar listas
Ignore la lista de edición MP4 / M4V / M4A / MOV con la
-ignore_editlist 1
opción de entrada. El valor predeterminado es no ignorar la lista de edición.Que significan las opciones de ffprobe
-v error
Esto oculta la salida de "información" (información de la versión, etc.) lo que facilita el análisis.-count_frames
Cuente el número de fotogramas por flujo e infórmelo en la sección de flujo correspondiente.-select_streams v:0
Seleccione solo la transmisión de video.-show_entries stream=nb_frames
o-show_entries stream=nb_read_frames
Mostrar solo la entrada paranb_frames
onb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Establezca el formato de salida (también conocido como el "escritor") endefault
, no imprima la clave de cada campo (nokey=1
) y no imprima el encabezado y pie de página de la sección (noprint_wrappers=1
). Hay alternativas más cortas como-of csv=p=0
.Ver también
información de los medios
La conocida
mediainfo
herramienta puede generar el número de fotogramas:MP4Box
Para archivos MP4 / M4V / M4A.
MP4Box
de gpac puede mostrar el número de fotogramas:Consulte la
Media Info
línea en la salida para la transmisión de video en cuestión:En este ejemplo, la secuencia de video tiene 2525 cuadros.
caja
Para archivos MP4 / M4V / M4A / MOV.
boxdumper
es una sencilla herramienta de l-smash. Producirá una gran cantidad de información. En lastsz
sección del cuadro de tamaño de muestra, consultesample_count
el número de fotogramas. En este ejemplo, la entrada tiene 1900 fotogramas de video:stsz
átomo.fuente
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
En Unix, esto funciona a la perfección:
fuente
ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Calcúlalo en función del tiempo.
Eso es lo que hago y funciona muy bien para mí y para muchos otros). Primero, busque la duración del video en el siguiente fragmento:
Debería poder encontrar de manera consistente y segura
Duration: hh:mm:ss.nn
para determinar el tamaño del videoclip de origen. Luego, para cada línea de actualización (CR, no LF) puede analizar el texto para la marca de tiempo actual en la que se encuentra:Solo tenga cuidado de no esperar siempre un resultado perfecto de estas líneas de estado. Pueden incluir mensajes de error como aquí:
Una vez que usted tiene el tiempo, es simple matemática:
time / durration * 100 = % done
.fuente
TimeSpan
partir de él y luego usarcurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. El TimeSpan también proporciona una potente función de análisis, compruébaloNo todos los formatos almacenan su recuento de fotogramas o la duración total, e incluso si lo hacen, el archivo puede estar incompleto, por lo que ffmpeg no detecta ninguno de ellos con precisión de forma predeterminada.
En su lugar, intente buscar el final del archivo y lea la hora, luego cuente la hora actual mientras avanza.
Alternativamente, puede probar
AVFormatContext->nb_index_entries
o la duración detectada, que debería funcionar en AVI / MOV bien al menos sin daños, o la biblioteca FFMS2, que probablemente sea demasiado lenta para molestarse en una barra de progreso.fuente
Prueba algo como:
Escribe el número de fotograma en stderr, por lo que puede recuperar el último fotograma de este.
fuente
Puede usar
ffprobe
para obtener el número de fotograma con los siguientes comandosffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
que dicen imprimir datos en
json
formatoselect_streams v
le diráffprobe
que nos brindevideo
datos de transmisión y, si los elimina, también le brindaráaudio
informacióny la salida será como
2. puedes usar
que le dará datos de flujo, si desea información seleccionada como velocidad de fotogramas, use el siguiente comando
que dan una base numérica en la información de su video, el problema es que cuando usa este método, es posible que obtenga una
N/A
salida como.para obtener más información, consulte esta página FFProbe Tips
fuente
prueba esto:
fuente
*.ts
. La salida es una línea vacía.Dado que mi comentario recibió algunos votos a favor, pensé que lo dejaría como respuesta:
Esto debería ser rápido, ya que no se está realizando ninguna codificación.
ffmpeg
simplemente demux el archivo y leerá (decodificará) el primer flujo de video lo más rápido posible. El primergrep
comando tomará el texto que muestra el marco. El segundogrep
comando tomará solo el número de eso. Eltail
comando solo mostrará la línea final (recuento de fotogramas final).fuente
para construir sobre la respuesta de Stu. así es como encontré la velocidad de fotogramas de un video desde mi teléfono móvil. Ejecuté el siguiente comando por un tiempo. Dejé que el recuento de cuadros llegara a aproximadamente ~ 10,000 antes de impacientarme y presionar ^ C:
luego, tomé dos piezas de información de esa línea que comienza con "frame =", el número de cuadros, 7989, y el tiempo, 00: 04: 26.30. Primero debe convertir el tiempo en segundos y luego dividir el número de fotogramas por segundos para obtener "fotogramas por segundo". "fotogramas por segundo" es su velocidad de fotogramas.
la velocidad de fotogramas de mi video es de 30 fps.
fuente
La única precisión que he podido hacer es la siguiente:
Para asegurarse de que esto funcione con video:
fuente
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Lo siento por la respuesta necro, pero tal vez necesite esto (ya que no encontré una solución para las versiones recientes de ffmpeg.
Con ffmpeg 3.3.4 encontré uno que puede encontrar con lo siguiente:
Al final, dará salida al recuento de cuadros. Me funcionó en videos con audio. Sin embargo, da dos veces una línea "nb_frames", pero la primera línea fue el recuento de cuadros real en los videos que probé.
fuente
Utilizo php_ffmpeg y luego puedo obtener todos los tiempos y todos los fotogramas de una película. Como a continuación
Y luego el detalle está en la página.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
fuente
fuente
linux
rubí
fuente