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
  }
}
JBernardo
fuente
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"
    }
  }
}
Irexisto
fuente
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
Oleksandr Kyrpa
fuente
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
NT3RP
fuente
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.

yglodt
fuente