FFprobe,如何以JSON格式获取动画gif的帧速率(十进制)

FFprobe,如何以JSON格式获取动画gif的帧速率(十进制),json,ffmpeg,animated-gif,frame-rate,ffprobe,Json,Ffmpeg,Animated Gif,Frame Rate,Ffprobe,当我对动画gif使用ffprobe时,除其他外,我得到: > ffprobe.exe foo.gif . . . Stream #0:0: Video: gif, bgra, 500x372, 6.67 fps, 6.67 tbr, 100 tbn, 100 tbc 伟大的;这告诉我帧速率是每秒6.67帧。但我将在程序中使用它,并希望它是解析格式。ffprobe不支持json,但当我使用它时: > ffprobe.exe -show_streams -of json foo.g

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

> ffprobe.exe  foo.gif
. . . 
Stream #0:0: Video: gif, bgra, 500x372, 6.67 fps, 6.67 tbr, 100 tbn, 100 tbc
伟大的;这告诉我帧速率是每秒6.67帧。但我将在程序中使用它,并希望它是解析格式。ffprobe不支持json,但当我使用它时:

> ffprobe.exe -show_streams -of json foo.gif
json显示:

"r_frame_rate": "20/3",
"avg_frame_rate": "20/3",
但是我想要十进制的6.67而不是20/3。有没有办法让FFProbe生成十进制的JSON输出?我好像在文件里找不到

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

我确实研究过使用ImageMagick,但所讨论的GIF文件已损坏(我正在编写一个简单的修复程序);IM的“identify”命令在其上暂停,而FFMpeg&FFProbe可以很好地处理它

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


但我还是有点好奇是否有答案。

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

  • 您可以在python和mediainfo中使用子流程模块:
    fps=float(subprocess.check_output('mediainfo--Inform=“Video;%FrameRate%”input.mp4,shell=True))
    这里返回的值是字符串,这就是我将其转换为float的原因。不幸的是,如果没有
    shell=True
    ,我无法执行相同的操作,但可能我遗漏了一些东西
  • 使用ffprobe:
    ffprobe-v error-select_streams v:0-show_entries stream=avg_frame_rate-of default=noprint_wrappers=1:nokey=1 input.mp4
    这里的问题是输出是50/1,或者在您的情况下是20/3,因此您需要将输出按“/”分割,然后转换并分割列表中的两个元素。比如:
  • fps=子进程。检查_输出(['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\u streams v:0-show\u entries stream=r\u frame\u rate-of default=noprint\u wrappers=1:nokey=1 input.mp4
    mediainfo--Inform=“Video;%FrameRate%”input.mp4
    在Python中,您只需使用:

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

    通常有更好的方法来做事情,而不是
    eval()
    。例如,
    int('61')
    eval('61')
    frame_rate_str = "15/3"
    frame_rate = eval(frame_rate_str)