Get ffmpeg information in friendly way

84,755

Solution 1

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"
    }
  }
}

Solution 2

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

Solution 3

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

ffprobe ... -print_format json

Solution 4

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.

Share:
84,755
JBernardo
Author by

JBernardo

Senior Back-end and Cloud Engineer developing high performance distributed systems.

Updated on December 18, 2020

Comments

  • JBernardo
    JBernardo over 3 years

    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
      }
    }
    
  • JBernardo
    JBernardo over 12 years
    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...
  • user222758
    user222758 almost 12 years
    If anyone ever need, I've written a PHP solution based on that answer: stackoverflow.com/questions/11805207/…
  • mgrandi
    mgrandi almost 10 years
    @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
  • mangia
    mangia over 9 years
    Sorry for digging this out, but is there any chance to speed this up? It takes 5-6 seconds to show the output
  • Matt Fletcher
    Matt Fletcher over 9 years
    That final sentence is exactly what I needed. Thanks :)
  • farhad.kargaran
    farhad.kargaran over 8 years
    my app close with out displaying any message, when I use ffprob command! why??? but ffmpeg works fine
  • patrick
    patrick over 8 years
    people... asking a question in a comment to an answer from 4 years ago has about zero chance of getting answered...
  • Wilf
    Wilf about 8 years
    Other formats can also be used - XML etc: ffmpeg.org/ffprobe-all.html#toc-Writers
  • Chih-Hsuan Yen
    Chih-Hsuan Yen almost 8 years
    You can also use -of json instead of -print_format json. The former is compatible with avprobe while the latter not.
  • Salem
    Salem almost 7 years
    I find myself coming back to this somewhat often. Great answer!
  • Duvrai
    Duvrai over 5 years
    Good to know. I wonder why this is not mentioned in the docs.
  • Chris W
    Chris W almost 4 years
    This is good! The reason the "-progress -" isn't mentioned in the docs is because "-" just means pipe it to stdout
  • llogan
    llogan over 3 years
    The s=x sets the character that separates the fields when using csv output format. Useful for asking for width,height to get output like 1280x720. Pretty ugly otherwise. Default is a comma if you remove :s=x, or you can always use a different -of type such as json.
  • Kemal Ahmed
    Kemal Ahmed almost 3 years
    does it also print duration?