Source code for cgl.plugins.otio.tools.utils
import json
import subprocess
import cgl.plugins.alchemy.query as alc_query
FFMPEG_EXEC = alc_query.ffmpeg_path()
FFPROBE_EXEC = alc_query.ffprobe_path()
[docs]
def get_nearest_rate(self, frame_rate):
"""Convert a float frame rate to an exact fraction
Args:
frame_rate (float): Frames per second
"""
# rates are from the sequencer display rate menu
rates = ((12, 1),
(15, 1),
(24000, 1001),
(24, 1),
(25, 1),
(30000, 1001),
(30, 1),
(48, 1),
(60000, 1001),
(50, 1),
(60, 1),
(100, 1),
(120, 1),
(240, 1))
nearest = None
min_diff = float('inf')
for i, (num, den) in enumerate(rates):
valid_rate = float(num)/float(den)
if frame_rate == valid_rate:
return [num, den]
diff = abs(frame_rate - valid_rate)
if (diff >= min_diff):
continue
min_diff = diff
nearest = [num, den]
return nearest
[docs]
def check_ffmpeg_version():
cmd= [FFMPEG_EXEC, '-show_versions', '-of', 'json']
# print(subprocess.list2cmdline(cmd))
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
raise subprocess.CalledProcessError(
p.returncode, subprocess.list2cmdline(cmd), stderr
)
data = json.loads(stdout)
# it no reliable to parse the program version
# check the version of libraries instead
version_check = {
'libavcodec': 60.3,
'libavformat': 60.3
}
for lib in data.get("library_versions", []):
name = lib['name']
if name not in version_check:
continue
version = float(f"{lib['major']}.{lib['minor']}")
if version < version_check[name]:
return False
return True
if __name__ == "__main__":
print(check_ffmpeg_version())