pymediainfo读取frame_rate_mode判断异常:恒定帧率文件识别失败
解决pymediainfo判断帧率模式的问题
问题根源
你的代码有两个核心问题:
- for-else逻辑误用:Python的
for-else结构中,else块会在for循环完整遍历完所有元素且没有触发break时执行。哪怕循环中找到了符合条件的track并打印了yes,后续遍历完剩余track后,依然会执行else的nope。 - 未过滤轨道类型:
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
相关产品推荐
相关产品推荐

