Obtenga información de ffmpeg de manera amigable


108

Cada vez que trato de obtener información sobre mis archivos de video con ffmpeg, arroja mucha información inútil mezclada con cosas buenas.

Estoy usando ffmpeg -i name_of_the_video.mpg.

¿Hay posibilidades de conseguirlo de forma amistosa? Quiero decir que JSON sería genial (e incluso un XML feo está bien).

A estas alturas, hice que mi aplicación analizara los datos con expresiones regulares, pero hay muchos rincones desagradables que aparecen en algunos archivos de video específicos. Arreglé todo lo que encontré, pero puede que haya más.

Quería algo como:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}

3
¿Ha echado un vistazo a ffprobe ? Parece proporcionar una salida legible JSON.
NT3RP

Ya lo he visto, pero no pude encontrar el formato de salida JSON
JBernardo

Respuestas:


292

Un poco tarde, pero quizás aún sea relevante para alguien.

ffprobede hecho, es una excelente manera de hacerlo. Sin embargo, tenga en cuenta que debe indicar ffprobequé información desea que muestre (con las opciones -show_format, -show_packetsy -show_streams) o simplemente le dará una salida en blanco (como mencionó en uno de sus comentarios).

Por ejemplo, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfproduciría algo como lo siguiente:

{
  "streams": [{
    "index": 0,
    "codec_name": "wmv3",
    "codec_long_name": "Windows Media Video 9",
    "codec_type": "video",
    "codec_time_base": "1/1000",
    "codec_tag_string": "WMV3",
    "codec_tag": "0x33564d57",
    "width": 320,
    "height": 240,
    "has_b_frames": 0,
    "pix_fmt": "yuv420p",
    "level": -99,
    "r_frame_rate": "30000/1001",
    "avg_frame_rate": "0/0",
    "time_base": "1/1000",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "language": "eng"
    }
  }],
  "format": {
    "filename": "somefile.asf",
    "nb_streams": 1,
    "format_name": "asf",
    "format_long_name": "ASF format",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "WMFSDKVersion": "10.00.00.3646",
        "WMFSDKNeeded": "0.0.0.0000",
        "IsVBR": "0"
    }
  }
}

1
Si alguien alguna vez lo necesita, he escrito una solución PHP basada en esa respuesta: stackoverflow.com/questions/11805207/…
Paulo Freitas

Perdón por investigar esto, pero ¿hay alguna posibilidad de acelerarlo? Se necesitan entre 5 y 6 segundos para mostrar la salida
mangia

Esa frase final es exactamente lo que necesitaba. Gracias :)
Matt Fletcher

5
personas ... hacer una pregunta en un comentario a una respuesta de hace 4 años tiene casi cero posibilidades de obtener una respuesta ...
patrick

1
También puede utilizar en -of jsonlugar de -print_format json. El primero es compatible avprobemientras que el segundo no.
Chih-Hsuan Yen

15

Ahora es posible usarlo -progress -para imprimir información amigable formateada por key=value.

ffmpeg  -i video.mp4 .......-s 1920x1080 -progress - -y out.mp4

speed=5.75x
frame=697
fps=167.7
stream_0_0_q=39.0
bitrate=2337.0kbits/s
total_size=6979778
out_time_ms=23893333
out_time=00:00:23.893333
dup_frames=0
drop_frames=0

3
Bueno saber. Me pregunto por qué no se menciona esto en los documentos .
Duvrai

¡Esto es bueno! La razón por la que "-progress -" no se menciona en los documentos es porque "-" solo significa canalizarlo a stdout
Chris W

13

Podrías intentarlo ffprobe. El comando correcto para obtener la salida JSON debería tener el siguiente aspecto:

ffprobe ... -print_format json

2
Compilé el ffmpeg más nuevo, pero la salida json del programa es solo {}. No parece funcionar con los archivos de video que tengo ...
JBernardo

2
@JBernardo Oye, en caso de que alguien más se encuentre con esto, tienes que hacer -print_format en lugar de -of o de lo contrario simplemente hará una muy inútil {... salida de impresión normal aquí ...}, mira la respuesta aceptada para un ejemplo de línea de comando
mgrandi

0

Otro uso ffprobeque se puede analizar muy bien:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,bit_rate,codec_name,duration -of csv=p=0:s=x video.mp4

resulta en:

h264x600x480x25/1x385.680000x542326

-select_streams v:0selecciona solo la secuencia de video. Si elimina ese parámetro, obtiene una línea para cada flujo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.