Get ffmpeg information in friendly way
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.
JBernardo
Senior Back-end and Cloud Engineer developing high performance distributed systems.
Updated on December 18, 2020Comments
-
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 over 12 yearsI 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 almost 12 yearsIf anyone ever need, I've written a PHP solution based on that answer: stackoverflow.com/questions/11805207/…
-
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 over 9 yearsSorry for digging this out, but is there any chance to speed this up? It takes 5-6 seconds to show the output
-
Matt Fletcher over 9 yearsThat final sentence is exactly what I needed. Thanks :)
-
farhad.kargaran over 8 yearsmy app close with out displaying any message, when I use ffprob command! why??? but ffmpeg works fine
-
patrick over 8 yearspeople... asking a question in a comment to an answer from 4 years ago has about zero chance of getting answered...
-
Wilf about 8 yearsOther formats can also be used - XML etc: ffmpeg.org/ffprobe-all.html#toc-Writers
-
Chih-Hsuan Yen almost 8 yearsYou can also use
-of json
instead of-print_format json
. The former is compatible withavprobe
while the latter not. -
Salem almost 7 yearsI find myself coming back to this somewhat often. Great answer!
-
Duvrai over 5 yearsGood to know. I wonder why this is not mentioned in the docs.
-
Chris W almost 4 yearsThis is good! The reason the "-progress -" isn't mentioned in the docs is because "-" just means pipe it to stdout
-
llogan over 3 yearsThe
s=x
sets the character that separates the fields when usingcsv
output format. Useful for asking forwidth,height
to get output like1280x720
. 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 almost 3 yearsdoes it also print duration?