【问题标题】:Get ffmpeg information in friendly way以友好的方式获取ffmpeg信息
【发布时间】:2011-12-04 05:38:30
【问题描述】:

每次我尝试使用 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
  }
}

【问题讨论】:

  • 你看过ffprobe吗?它似乎提供了 JSON 可读的输出。
  • 我已经看过但找不到 JSON 输出格式

标签: json parsing ffmpeg


【解决方案1】:

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

ffprobe ... -print_format json

【讨论】:

  • 我编译了最新的ffmpeg,但是程序的json输出只有{}。它似乎不适用于我拥有的视频文件...
  • @JBernardo 嘿,如果其他人遇到这种情况,您必须执行 -print_format 而不是 -of 否则它只会做一个非常无用的 { ... 此处的正常打印输出 ... },请参阅接受的示例命令行答案
【解决方案2】:

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

ffprobe 确实是一个很好的方法。但是请注意,您需要告诉ffprobe 您希望它显示什么信息(使用-show_format-show_packets-show_streams 选项),否则它只会给您空白输出(就像您在一你的 cmets)。

例如,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"
    }
  }
}

【讨论】:

  • 如果有人需要,我已经根据该答案编写了一个 PHP 解决方案:stackoverflow.com/questions/11805207/…
  • 抱歉挖掘了这个,但有没有机会加快这个速度?显示输出需要 5-6 秒
  • 最后一句话正是我所需要的。谢谢:)
  • 人们...在对 4 年前的答案的评论中提出问题,得到回答的机会几乎为零...
  • 您也可以使用-of json 代替-print_format json。前者兼容avprobe,后者不兼容。
【解决方案3】:

现在可以使用-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

【讨论】:

  • 很高兴知道。我想知道为什么docs 中没有提到这一点。
  • 这很好!文档中没有提到“-progress -”的原因是因为“-”只是意味着将它通过管道传输到标准输出
  • 它是否也打印持续时间?
【解决方案4】:

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 只选择第一个视频流。如果您删除该参数,您会为每个流获得一行。

【讨论】:

猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多