从ffmpeg -i获取视频尺寸

2024-04-28 16:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从ffmpeg的信息输出中获取视频的高度和宽度。例如,使用以下输出--

$ ffmpeg -i 1video.mp4
...

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/david/Desktop/1video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2010-01-24 00:55:16
  Duration: 00:00:35.08, start: 0.000000, bitrate: 354 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 640x360 [PAR 1:1 DAR 16:9], 597 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc
    Metadata:
      creation_time   : 2010-01-24 00:55:16
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 109 kb/s
    Metadata:
      creation_time   : 2010-01-24 00:55:17
At least one output file must be specified

我怎么才能得到height = 640, width= 360?谢谢您。


Tags: 信息inputstream视频宽度高度kbtime
3条回答

从上面的Fredrik技巧来看,下面是我如何使用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'

使用ffprobe

示例1:使用键/变量名

ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 input.mp4
width=1280
height=720

例2:仅宽x高

ffprobe -v error -show_entries stream=width,height -of csv=p=0:s=x input.m4v
1280x720

示例3:JSON

ffprobe -v error -show_entries stream=width,height -of json input.mkv 
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        },
        {

        }
    ]
}

选项的作用:

  • -v error进行安静输出,但允许显示错误。排除常见的通用FFmpeg输出信息,包括版本、配置和输入详细信息。

  • -show_entries stream=width,height只显示widthheight流信息。

  • -of选项选择输出格式(default、compact、csv、flat、ini、json、xml)。有关每个格式的说明和查看其他格式选项,请参见FFprobe Documentation: Writers

  • -select_streams v:0如果输入包含多个视频流,则可以添加此选项。v:0将只选择第一个视频流。否则,您将获得与视频流一样多的widthheight输出。

  • 有关详细信息,请参见FFprobe DocumentationFFmpeg Wiki: FFprobe Tips

看看mediainfo处理的大多数格式。

如果您正在寻找解析ffmpeg输出的方法,请使用regexp\d+x\d+

使用perl的示例:

$ ./ffmpeg -i test020.3gp 2>&1 | perl -lane 'print $1 if /(\d+x\d+)/'
176x120

使用python的示例(不完美):

$ ./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一行不如perl一行那么吸引人:-)

相关问题 更多 >