Python:如何从视频中获取显示宽高比?

时间:2017-08-17 15:11:00

标签: python opencv video aspect-ratio

我有一个视频,其中ffmpeg告诉我存储宽高比(SAR)为4:3,但显示宽高比DAR为16:9。分辨率为1440x1080。 有没有机会用Python-OpenCV或任何其他软件包找出16:9的DAR?

2 个答案:

答案 0 :(得分:2)

存储宽高比是图像宽度与高度的比率(以像素为单位),可以从视频文件中轻松计算出来。

显示宽高比是在屏幕上显示时图像宽度与高度的比率(以厘米或英寸为单位的长度),是根据像素宽高比和存储的组合计算的宽高比。

SAR×PAR = DAR。

例如,640×480 VGA图像的SAR为640/480 = 4:3,如果在4:3显示器上显示(DAR = 4:3),则为方形像素,因此PAR为1: 1。相比之下,720×576 D-1 PAL图像的SAR为720/576 = 5:4,但显示在4:3显示屏上(DAR = 4:3)。

Source

因此,使用OpenCV可以获得SAR(像素尺寸比)但我怀疑你可以从中得到常数显示宽高比(因为它取决于显示器)。

你可以做的是在图片displaying时,你可以得到window property,其标志为 WND_PROP_ASPECT_RATIO

答案 1 :(得分:1)

我相信这适用于大多数视频(需要ffmpeg附带的ffprobe)

import subprocess
import json
def get_aspect_ratios(video_file):
    cmd = 'ffprobe -i "{}" -v quiet -print_format json -show_format -show_streams'.format(video_file)
#     jsonstr = subprocess.getoutput(cmd)
    jsonstr = subprocess.check_output(cmd, shell=True, encoding='utf-8')
    r = json.loads(jsonstr)
    # look for "codec_type": "video". take the 1st one if there are mulitple
    video_stream_info = [x for x in r['streams'] if x['codec_type']=='video'][0]
    if 'display_aspect_ratio' in video_stream_info and video_stream_info['display_aspect_ratio']!="0:1":
        a,b = video_stream_info['display_aspect_ratio'].split(':')
        dar = int(a)/int(b)
    else:
        # some video do not have the info of 'display_aspect_ratio'
        w,h = video_stream_info['width'], video_stream_info['height']
        dar = int(w)/int(h)
        ## not sure if we should use this
        #cw,ch = video_stream_info['coded_width'], video_stream_info['coded_height']
        #sar = int(cw)/int(ch)
    if 'sample_aspect_ratio' in video_stream_info and video_stream_info['sample_aspect_ratio']!="0:1":
        # some video do not have the info of 'sample_aspect_ratio'
        a,b = video_stream_info['sample_aspect_ratio'].split(':')
        sar = int(a)/int(b)
    else:
        sar = dar
    par = dar/sar
    return dar, sar, par

-----------旧答案--------------------------

import subprocess
import json
cmd = "ffprobe -i D:/out.mp4  -v quiet -print_format json -show_format -show_streams"
jsonstr = subprocess.getoutput(cmd)
r = json.loads(jsonstr)
a,b = r['streams'][0]['display_aspect_ratio'].split(':')
dar = int(a)/int(b)
print(a, b, dar)