video - para - Recuperar el conteo de cuadros con ffmpeg
ffmpeg ubuntu (12)
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
.
¿Alguien sabe cómo obtener el número total de fotogramas de un archivo de video usando ffmpeg? La salida de representación de ffmpeg muestra el fotograma actual y necesito el número de fotogramas para calcular el progreso en porcentaje.
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 '' ''
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
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.
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é.
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 fotograma con los siguientes comandos
- 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_impaired": 0,
"visual_impaired": 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 fotogramas, 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
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.
para construir sobre la respuesta de Stu. así es como encontré la velocidad de fotogramas 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 fotogramas por segundos para obtener "fotogramas 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 fotogramas para mi video es de 30 fps.
prueba esto:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep ''frame='' | cut -f 2 -d '' ''
linux
ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null
rubí
result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]
Nota: La presencia de una lista de edición en MP4 / M4V / M4A / MOV puede afectar su número de fotograma. 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 fotogramas
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 fotogramas
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 tieneawk
, como en Windows, y consulteframe=
cerca del final de la salida de la consola.
Contar solo cuadros clave
Añadir -skip_frame nokey
.
- Funciona tanto para
ffprobe
como paraffmpeg
.
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 fotogramas 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 paranb_frames
onb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Establezca el formato de salida (también conocido como "escritor") comodefault
, 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
mediainfo
La conocida herramienta de información mediainfo
puede generar el número de fotogramas:
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 fotogramas. 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
.