Recuperar el conteo de cuadros con ffmpeg

¿Alguien sabe cómo obtener el número total de fotogtwigs de un archivo de video usando ffmpeg? La salida de representación de ffmpeg muestra el fotogtwig actual y necesito el número de fotogtwigs para calcular el progreso en porcentaje.

Nota: La presencia de una lista de edición en MP4 / M4V / M4A / MOV puede afectar su número de fotogtwig. Ver Editar listas a continuación.

ffprobe y ffmpeg

ffprobe : consultar el contenedor

 ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4 
  • Este es un método rápido.
  • No todos los formatos reportarán el número de cuadros, lo que resulta en una salida de N/A Vea los otros métodos enumerados a continuación.

ffprobe : decodifica y cuenta el número de fotogtwigs

 ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv 
  • Este es un método lento. Debido a que el archivo completo debe decodificarse, puede tomar un tiempo completarlo dependiendo de la duración y la complejidad de su entrada.

ffmpeg : decodifica y cuenta el número de fotogtwigs

Si no tienes ffprobe , puedes usar ffmpeg y awk lugar:

 ffmpeg -i input.mkv -map 0:v:0 -c copy -f null - 2>&1 | awk '/frame=/ {print $2}' 
  • Este es un método lento. Debido a que el archivo completo debe decodificarse, puede tomar un tiempo completarlo dependiendo de la duración y la complejidad de su entrada.
  • Puedes omitir 2>&1 | awk '/frame=/{print $2}' 2>&1 | awk '/frame=/{print $2}' si no tiene awk , como en Windows, y consulte frame= cerca del final de la salida de la consola.

Contar solo cuadros clave

Añadir -skip_frame nokey .

  • Funciona tanto para ffprobe como para ffmpeg .

Editar listas

Ignore la lista de edición MP4 / M4V / M4A / MOV con la -ignore_editlist 1 entrada -ignore_editlist 1 . El valor predeterminado es no ignorar la lista de edición.

Qué significan las opciones de ffprobe

  • -v error Esto oculta la salida de “información” (información de versión, etc.) que facilita el análisis.

  • -count_frames Cuenta el número de fotogtwigs por transmisión y lo informa en la sección de transmisión correspondiente.

  • -select_streams v:0 Seleccione solo la transmisión de video.

  • -show_entries stream=nb_frames o -show_entries stream=nb_read_frames Muestra solo la entrada para nb_frames o nb_read_frames .

  • -of default=nokey=1:noprint_wrappers=1 Establezca el formato de salida (también conocido como “escritor”) como default , 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

  • Documentación FFprobe
  • Wiki FFmpeg: Consejos FFprobe

mediainfo

La conocida herramienta de información mediainfo puede generar el número de fotogtwigs:

 mediainfo --Output="Video;%FrameCount%" input.avi 

MP4Box

Para archivos MP4 / M4V / M4A.

MP4Box de gpac puede mostrar la cantidad de cuadros:

 MP4Box -info input.mp4 

Consulte la línea de Media Info en la salida para la transmisión de video en cuestión:

 Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples 

En este ejemplo, la transmisión de video tiene 2525 cuadros.


boxdumper

Para archivos MP4 / M4V / M4A / MOV.

boxdumper es una herramienta simple de l-smash. Producirá una gran cantidad de información. En la sección del cuadro de tamaño de muestra stsz , consulte sample_count para el número de fotogtwigs. En este ejemplo, la entrada tiene 1900 cuadros de video:

 boxdumper input.mp4 ... [stsz: Sample Size Box] position = 342641 size = 7620 version = 0 flags = 0x000000 sample_size = 0 (variable) sample_count = 1900 
  • Tenga en cuenta que un archivo puede tener más de un átomo stsz .

En Unix, esto funciona como encanto:

 ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' ' 

Cálculo en función del tiempo, en su lugar.

Eso es lo que hago y funciona muy bien para mí y para muchos otros). Primero, busca la duración del video en el siguiente fragmento:

 Seems stream 0 codec frame rate differs from container frame rate: 5994.00 (5994/1) -> 29.97 (30000/1001) Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov': Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16 Stream #0.2(eng): Data: tmcd / 0x64636D74 

Deberá poder encontrar de forma 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, sin LF) puede analizar el texto de la marca de tiempo actual en:

 frame= 84 fps= 18 q=10.0 size= 5kB time=1.68 bitrate= 26.1kbits/s frame= 90 fps= 17 q=10.0 size= 6kB time=1.92 bitrate= 23.8kbits/s frame= 94 fps= 16 q=10.0 size= 232kB time=2.08 bitrate= 913.0kbits/s 

Solo cuidado de no esperar siempre resultados perfectos de estas líneas de estado. Pueden incluir mensajes de error como aquí:

 frame= 24 fps= 24 q=-1.0 size= 0kB time=1.42 bitrate= 0.3kbits/s frame= 41 fps= 26 q=-1.0 size= 0kB time=2.41 bitrate= 0.2kbits/s [h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in sequential order frame= 49 fps= 24 q=26.0 size= 4kB time=0.28 bitrate= 118.1kbits/s frame= 56 fps= 22 q=23.0 size= 4kB time=0.56 bitrate= 62.9kbits/s 

Una vez que tienes el tiempo, es simple matemática: time / durration * 100 = % done .

No todos los formatos almacenan el recuento de cuadros 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 hasta 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 al menos no dañado, o en la biblioteca FFMS2, que probablemente sea demasiado lenta para una barra de progreso.

Pruebe algo como:

 ffmpeg -i "path to file" -f null /dev/null 

Escribe el número de cuadro en stderr, para que pueda recuperar el último cuadro de este.

Puede usar ffprobe para obtener el número de fotogtwig con los siguientes comandos

  1. primer método

ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v

que dicen imprimir datos en formato json

select_streams v le dirá a ffprobe que solo nos proporcione datos de transmisión de video y, si lo elimina, también le proporcionará información de audio

y la salida será como

 { "streams": [ { "index": 0, "codec_name": "mpeg4", "codec_long_name": "MPEG-4 part 2", "profile": "Simple Profile", "codec_type": "video", "codec_time_base": "1/25", "codec_tag_string": "mp4v", "codec_tag": "0x7634706d", "width": 640, "height": 480, "coded_width": 640, "coded_height": 480, "has_b_frames": 1, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "4:3", "pix_fmt": "yuv420p", "level": 1, "chroma_location": "left", "refs": 1, "quarter_sample": "0", "divx_packed": "0", "r_frame_rate": "10/1", "avg_frame_rate": "10/1", "time_base": "1/3000", "start_pts": 0, "start_time": "0:00:00.000000", "duration_ts": 256500, "duration": "0:01:25.500000", "bit_rate": "261.816000 Kbit/s", "nb_frames": "855", "nb_read_frames": "855", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaird": 0, "visual_impaird": 0, "clean_effects": 0, "attached_pic": 0 }, "tags": { "creation_time": "2005-10-17 22:54:33", "language": "eng", "handler_name": "Apple Video Media Handler", "encoder": "3ivx D4 4.5.1" } } ] } 

2. puedes usar

 ffprobe -v error -show_format -show_streams video_name 

que le dará datos de transmisión, si desea información seleccionada como velocidad de fotogtwigs, use el siguiente comando

 ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name 

que dan una base numérica en tu información de video, el problema es que cuando usas este método, es posible que obtengas una N/A como resultado.

para más información, consulte esta página FFProbe Tips

prueba esto:

 ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' ' 

para construir sobre la respuesta de Stu. así es como encontré la velocidad de fotogtwigs para un video desde mi teléfono móvil. ejecuté el siguiente comando por un tiempo. dejé que el recuento de cuadros alcanzara aproximadamente ~ 10,000 antes de impacientarme y presioné ^ C:

 $ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1 ... Press [q] to stop, [?] for help [null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up. frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0 video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042% Received signal 2: terminating. $ 

luego, tomé dos piezas de información de esa línea que comienza con “frame =”, el conteo de cuadros, 7989 y el tiempo, 00: 04: 26.30. Primero necesita convertir el tiempo en segundos y luego dividir el número de fotogtwigs por segundos para obtener “fotogtwigs por segundo”. “cuadros por segundo” es su velocidad de cuadro.

 $ bc -l 0*60*60 + 4*60 + 26.3 266.3 7989/(4*60+26.3) 30.00000000000000000000 $ 

la velocidad de fotogtwigs para mi video es de 30 fps.

Lo único exacto que he podido hacer es lo siguiente:

 ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME' 

Para asegurarse de que esto funcione con video:

 ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video 

Yo uso php_ffmpeg y puedo obtener todas las veces y todos los cuadros de una película. Como belows

 $input_file='/home/strone/workspace/play/CI/abc.rmvb'; $ffmpegObj = new ffmpeg_movie($input_file); echo $ffmpegObj->getDuration(); echo $ffmpegObj->getFrameCount(); 

Y luego el detalle está en la página.

http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php

Perdón por la respuesta necro, pero tal vez lo necesite (ya que no encontré una solución para los lanzamientos recientes de ffmpeg).

Con ffmpeg 3.3.4 encontré que uno puede encontrar con lo siguiente:

 ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames" 

Al final saldrá el conteo de cuadros. Me funcionó en videos con audio. Sin embargo, da dos veces una línea “nb_frames”, pero la primera línea era el recuento de cuadros reales en los videos que probé.

linux

 ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null 

Ruby

 result = `ffmpeg -i #{path} -f null - 2>&1` r = result.match("frame=([0-9]+)") pr[1]