139

Every time I try to get some information about my video files with ffmpeg, it pukes a lot of useless information mixed with good things.

I'm using ffmpeg -i name_of_the_video.mpg.

There are any possibilities to get that in a friendly way? I mean JSON would be great (and even ugly XML is fine).

By now, I made my application parse the data with regex but there are lots of nasty corners that appear on some specific video files. I fixed all that I encountered, but there may be more.

I wanted something like:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}
2
  • 4
    Have you taken a look at ffprobe? It seems to provide a JSON readable output.
    – NT3RP
    Commented Oct 10, 2011 at 4:24
  • I've lookead at it already but couldn't find the JSON output format
    – JBernardo
    Commented Oct 10, 2011 at 4:51

4 Answers 4

329

A bit late, but perhaps still relevant to someone..

ffprobe is indeed an excellent way to go. Note, though, that you need to tell ffprobe what information you want it to display (with the -show_format, -show_packets and -show_streams options) or it'll just give you blank output (like you mention in one of your comments).

For example, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asf would yield something like the following:

{
  "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"
    }
  }
}
11
  • 3
    If anyone ever need, I've written a PHP solution based on that answer: stackoverflow.com/questions/11805207/… Commented Aug 5, 2012 at 11:33
  • 1
    Sorry for digging this out, but is there any chance to speed this up? It takes 5-6 seconds to show the output
    – mangia
    Commented Aug 30, 2014 at 21:45
  • That final sentence is exactly what I needed. Thanks :) Commented Nov 5, 2014 at 16:58
  • 6
    people... asking a question in a comment to an answer from 4 years ago has about zero chance of getting answered...
    – patrick
    Commented Sep 4, 2015 at 19:06
  • 3
    You can also use -of json instead of -print_format json. The former is compatible with avprobe while the latter not. Commented Jul 8, 2016 at 13:50
25

Now is possible to use -progress - to print friendly info formatted by 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
5
  • 5
    Good to know. I wonder why this is not mentioned in the docs.
    – Duvrai
    Commented Sep 21, 2018 at 14:39
  • This is good! The reason the "-progress -" isn't mentioned in the docs is because "-" just means pipe it to stdout
    – Chris W
    Commented Jul 22, 2020 at 4:05
  • does it also print duration? Commented May 25, 2021 at 3:20
  • To have just progress it's good to add -v quiet or -v error to prevent "contaminating" the stdout with other logs.
    – kpostekk
    Commented Sep 10, 2022 at 12:13
  • This right here is a game changer. Thanks!
    – kyrlon
    Commented 2 days ago
13

You could try ffprobe. The correct command to get JSON output should look like the following:

ffprobe ... -print_format json
2
  • 2
    I compiled the newest ffmpeg but the json output of the program is only {}. It doesn't seems to work with the video files I have...
    – JBernardo
    Commented Oct 11, 2011 at 2:44
  • 3
    @JBernardo Hey, in case anyone else runs into this, you have to do -print_format rather then -of or else it will just do a very unhelpful { ... normal print output here ... }, see the accepted answer for an example command line
    – mgrandi
    Commented Jul 1, 2014 at 2:31
6

Another usage of ffprobe which is nicely parseable:

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

results in:

h264x600x480x25/1x385.680000x542326

-select_streams v:0 selects only the first video stream. If you remove that parameter you get one line for each stream.

1

Not the answer you're looking for? Browse other questions tagged or ask your own question.