当我使用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",
但如果有答案,我仍然很好奇。
答案 0 :(得分:1)
我知道这是一个有点老问题,但今天我尝试做同样的事情并找到了两个选择:
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))
我就无法执行同样的事情,但也许我错过了一些东西。shell=True
这里的问题是输出是50/1或者你的情况是20/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)