You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pymediainfo读取frame_rate_mode判断异常:恒定帧率文件识别失败

解决pymediainfo判断帧率模式的问题

问题根源

你的代码有两个核心问题:

  1. for-else逻辑误用:Python的for-else结构中,else块会在for循环完整遍历完所有元素且没有触发break时执行。哪怕循环中找到了符合条件的track并打印了yes,后续遍历完剩余track后,依然会执行else的nope。
  2. 未过滤轨道类型:media_info.tracks包含视频、音频、字幕等多种轨道,只有视频轨道才有frame_rate_mode相关属性,遍历所有轨道会导致无效检查,还干扰判断逻辑。

修正后的代码

from pymediainfo import MediaInfo

media_info = MediaInfo.parse('/Users/ra/Desktop/converts/mhl/50.mov')
is_constant = False

for track in media_info.tracks:
    # 只处理视频轨道
    if track.track_type == 'Video':
        # 注意:部分版本中other_frame_rate_mode返回列表,需取第一个元素;也可直接用frame_rate_mode的缩写判断
        if track.other_frame_rate_mode[0] == 'Constant' or track.frame_rate_mode == 'CFR':
            is_constant = True
            break  # 找到目标轨道后立即终止循环

if is_constant:
    print('yes')
    # 拼接恒定帧率对应的ffmpeg命令
    ffmpeg_cmd = f'ffmpeg -i "/Users/ra/Desktop/converts/mhl/50.mov" -c:v libx264 -crf 23 output.mp4'
else:
    print('nope')
    # 拼接可变帧率对应的ffmpeg命令(比如强制转恒定帧率)
    ffmpeg_cmd = f'ffmpeg -i "/Users/ra/Desktop/converts/mhl/50.mov" -r 24 -c:v libx264 -crf 23 output.mp4'

# 后续可通过subprocess执行命令
# import subprocess
# subprocess.run(ffmpeg_cmd, shell=True)

关键说明

  • 过滤视频轨道:通过track.track_type == 'Video'只处理视频轨道,避免无效遍历。
  • 修正判断逻辑:用变量标记结果,找到符合条件的轨道后立即break终止循环,再通过变量判断输出结果,彻底解决for-else的逻辑问题。
  • 属性取值适配:部分pymediainfo版本中,other_frame_rate_mode返回列表(如['Constant']),需取第一个元素;track.frame_rate_mode则返回缩写(CFR代表恒定帧率,VFR代表可变帧率),可根据你安装的库版本调整判断方式。
  • ffmpeg集成:将判断结果存入变量后,直接拼接对应的ffmpeg命令,后续用subprocess模块即可执行处理。

内容的提问来源于stack exchange,提问作者Cheesgrater2.0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:10:54