Getting video dimension / resolution / width x height from ffmpeg
Solution 1:
Use ffprobe
Example 1: With keys / variable names
ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 input.mp4
width=1280
height=720
Example 2: Just width x height
ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0:s=x input.m4v
1280x720
Example 3: JSON
ffprobe -v error -select_streams v -show_entries stream=width,height -of json input.mkv
{
"programs": [
],
"streams": [
{
"width": 1280,
"height": 720
}
]
}
Example 4: JSON Compact
ffprobe -v error -select_streams v -show_entries stream=width,height -of json=compact=1 input.mkv
{
"programs": [
],
"streams": [
{ "width": 1280, "height": 720 }
]
}
Example 5: XML
ffprobe -v error -select_streams v -show_entries stream=width,height -of xml input.mkv
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
<programs>
</programs>
<streams>
<stream width="1280" height="720"/>
</streams>
</ffprobe>
What the options do:
-
-v error
Make a quiet output, but allow errors to be displayed. Excludes the usual generic FFmpeg output info including version, config, and input details. -
-show_entries stream=width,height
Just show thewidth
andheight
stream information. -
-of
option chooses the output format (default, compact, csv, flat, ini, json, xml). See FFprobe Documentation: Writers for a description of each format and to view additional formatting options. -
-select_streams v:0
This can be added in case your input contains multiple video streams.v:0
will select only the first video stream. Otherwise you'll get as manywidth
andheight
outputs as there are video streams.-select_streams v
can be used to show info from all video streams and avoid empty audiostream
info in JSON and XML output. -
See the FFprobe Documentation and FFmpeg Wiki: FFprobe Tips for more info.
Solution 2:
Have a look at mediainfo Handles most of the formats out there.
If you looking for a way to parse the output from ffmpeg, use the regexp \d+x\d+
Example using perl:
$ ./ffmpeg -i test020.3gp 2>&1 | perl -lane 'print $1 if /(\d+x\d+)/'
176x120
Example using python (not perfect):
$ ./ffmpeg -i /nfshome/enilfre/pub/test020.3gp 2>&1 | python -c "import sys,re;[sys.stdout.write(str(re.findall(r'(\d+x\d+)', line))) for line in sys.stdin]"
[][][][][][][][][][][][][][][][][][][]['176x120'][][][]
Python one-liners aren't as catchy as perl ones :-)
Solution 3:
As mentioned here, ffprobe
provides a way of retrieving data about a video file. I found the following command useful ffprobe -v quiet -print_format json -show_streams input-video.xxx
to see what sort of data you can checkout.
I then wrote a function that runs the above command and returns the height and width of the video file:
import subprocess
import shlex
import json
# function to find the resolution of the input video file
def findVideoResolution(pathToInputVideo):
cmd = "ffprobe -v quiet -print_format json -show_streams"
args = shlex.split(cmd)
args.append(pathToInputVideo)
# run the ffprobe process, decode stdout into utf-8 & convert to JSON
ffprobeOutput = subprocess.check_output(args).decode('utf-8')
ffprobeOutput = json.loads(ffprobeOutput)
# find height and width
height = ffprobeOutput['streams'][0]['height']
width = ffprobeOutput['streams'][0]['width']
return height, width
Solution 4:
From Fredrik's tip above, here is how I did it using MediaInfo ( http://mediainfo.sourceforge.net/en ):
>>> p1 = subprocess.Popen(['mediainfo', '--Inform=Video;%Width%x%Height%',
'/Users/david/Desktop/10stest720p.mov'],stdout=PIPE)
>>> dimensions=p1.communicate()[0].strip('\n')
>>> dimensions
'1280x688'