FFprobe,如何以JSON格式将动画gif的帧速率作为十进制

时间:2017-03-17 22:51:23

标签: json ffmpeg animated-gif frame-rate ffprobe

当我使用ffprobe对抗动画gif时,除其他外,我得到了这个:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>


<div data-bind="click: conConfirmTransmit, visible: currentProcessStatusProgramCode() === 'CONSULTING', enable: isAllowedToConfirmAndTransmit" class="confirmbutton">click me </div>
<br>
change program code: <input type="text" data-bind="textInput: currentProcessStatusProgramCode"/>
 
<p>
is Allowed Confirm & Transmit <input type="checkbox" data-bind="checked: isAllowedToConfirmAndTransmit">
</p>

大;这告诉我帧速率是每秒6.67帧。但我将在一个程序中使用它,并希望它以解析的格式。 ffprobe做json,但是当我使用它时:

> ffprobe.exe  foo.gif
. . . 
Stream #0:0: Video: gif, bgra, 500x372, 6.67 fps, 6.67 tbr, 100 tbn, 100 tbc

json表示:

> ffprobe.exe -show_streams -of json foo.gif

但我想要小数形式6.67而不是20/3。有没有办法让FFProbe产生十进制的JSON输出?我似乎无法在文档中找到它。

我的平台是Windows; FFProbe版本为N-68482-g92a596f。

我确实研究过使用ImageMagick,但是有问题的GIF文件已损坏(我正在处理一个简单的修复程序); IM的“识别”命令暂停,而FFMpeg&amp; FFProbe处理得很好。

另外:现在这是一种学术性的;我刚刚使用(在Python中):

"r_frame_rate": "20/3",
"avg_frame_rate": "20/3",

但如果有答案,我仍然很好奇。

2 个答案:

答案 0 :(得分:1)

我知道这是一个有点老问题,但今天我尝试做同样的事情并找到了两个选择:

  1. 你可以在python和mediainfo中使用subprocess模块​​:public static IEnumerable<TResult> ZipCycle<TSource1, TSource2, TResult>( this IEnumerable<TSource1> first, IEnumerable<TSource2> second, Func<TSource1, TSource2, TResult> selector) { if (first == null) throw new ArgumentNullException(nameof(first)); if (second == null) throw new ArgumentNullException(nameof(second)); if (selector == null) throw new ArgumentNullException(nameof(selector)); return InnerZip(); IEnumerable<TResult> InnerZip() { using (var f = first.GetEnumerator()) using (var s = second.GetEnumerator()) { var firstIteration = true; while (f.MoveNext()) { if (!s.MoveNext()) { if (firstIteration) { yield break; } else { s.Reset(); s.MoveNext(); } } yield return selector(f.Current, s.Current); firstIteration = false; } } } } 这里返回的值是一个字符串,这就是我将它转换为float的原因。不幸的是,如果没有fps = float(subprocess.check_output('mediainfo --Inform="Video;%FrameRate%" input.mp4, shell=True))我就无法执行同样的事情,但也许我错过了一些东西。
  2. 使用ffprobe:shell=True这里的问题是输出是50/1或者你的情况是20/3,所以你需要将输出拆分为“/”然后转换并除以两个元素列表。类似的东西:
  3. ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4

    因此获取帧速率的正常命令是: fps = subprocess.check_output(['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=avg_frame_rate', '-of', 'default=noprint_wrappers=1:nokey=1', 'input.mp4']) fps_lst = fps.split('/') fps_real = float(fps_lst[0]) / int(fps_lst[1])ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4

答案 1 :(得分:0)

在Python中,您可以使用:

frame_rate_str = "15/3"
frame_rate = eval(frame_rate_str)