以友好的方式获取ffmpeg信息


108

每次我尝试使用ffmpeg获取有关我的视频文件的信息时,都会吐出很多无用的信息,混杂着很多好东西。

我正在使用ffmpeg -i name_of_the_video.mpg

有没有可能以友好的方式实现这一目标?我的意思是JSON会很棒(甚至丑陋的XML也可以)。

到目前为止,我使我的应用程序使用正则表达式解析数据,但是在某些特定的视频文件上却出现了很多讨厌的角落。我已修复所有遇到的问题,但可能还会更多。

我想要类似的东西:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}

3
你看过ffprobe吗?它似乎提供了JSON可读输出。
NT3RP

我已经看过它了,但是找不到JSON输出格式
JBernardo 2011年

Answers:


292

有点晚了,但也许仍然与某人有关。

ffprobe确实是一个极好的选择。但是请注意,你需要告诉ffprobe你想要什么信息就显示(与-show_format-show_packets-show_streams选项),或者它会只给你空白输出(如你在你的评论人提)。

例如,ffprobe -v quiet -print_format json -show_format -show_streams somefile.asf将产生如下内容:

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

1
如果有人需要,我已经基于该答案写了一个PHP解决方案:stackoverflow.com/questions/11805207/…–
Paulo Freitas

很抱歉,将其挖掘出来,但是有没有机会加快这一步?需要5-6秒才能显示输出
mangia

最后一句话正是我所需要的。谢谢:)
马特·弗莱彻

5
人们...从4年前开始的评论中问问题的可能性大约为零...
patrick

1
您也可以使用-of json代替-print_format json。前者与avprobe后者兼容。
智贤日元

15

现在可以用来-progress -打印格式为的友好信息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

3
很高兴知道。我不知道为什么文档中没有提到这一点。
Duvrai

很好!在文档中未提及“ -progress-”的原因是“-”仅表示将其传送到标准输出
Chris W

13

你可以试试看ffprobe。获取JSON输出的正确命令应如下所示:

ffprobe ... -print_format json

2
我编译了最新的ffmpeg,但该程序的json输出仅为{}。它似乎不适用于我拥有的视频文件...
JBernardo 2011年

2
@JBernardo嘿,以防万一其他人遇到这个问题,您必须-print_format而不是-of,否则它只会做一个非常无益的{...正常打印输出在这里...},有关示例命令行
mgrandi 2014年

0

ffprobe可以很好地解析其另一种用法:

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

结果是:

h264x600x480x25/1x385.680000x542326

-select_streams v:0仅选择视频流。如果删除该参数,则每个流只有一行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.