Python调用FFmpeg切割火箭联盟游戏录像无输出问题排查
火箭联盟进球剪辑脚本故障修复方案
故障根因
- CSV解析逻辑不可靠:仅通过简单字符串替换处理结构化的列表格式内容,容易出现引号、转义符残留,导致读取的文件路径、帧号格式错误,ffmpeg识别输入文件失败。
- 输出目录未提前校验:如果脚本上级目录的
clips文件夹不存在,ffmpeg写入输出文件时会直接失败,而os.system调用不会抛出Python层面的错误,也默认不打印ffmpeg的报错日志。 - 路径传参方式存在兼容问题:手动给路径加双引号的方式在Windows环境下容易出现转义异常,尤其路径包含空格、特殊符号时大概率失效。
- 帧率计算未完全适配:原脚本所有时间计算都基于30fps,切换60fps需要替换所有帧率相关的常量,仅替换部分不会生效。
- 可选故障点:若ffmpeg未加入系统环境变量,
os.system调用会直接失败,无任何反馈。
修复方案
核心优化点
- 用
ast.literal_eval直接解析CSV中序列化的列表结构,完全避免字符串替换的解析错误 - 提前创建输出目录,避免写入失败
- 用
subprocess.run替代os.system,原生支持带空格的路径,可直接打印ffmpeg运行日志方便排查 - 统一帧率常量,修改一处即可适配不同帧率的源视频
修复后完整代码
import ntpath import os import ast import subprocess # 可根据你的源视频帧率直接修改此处 FPS = 60 # 进球前保留的秒数 PRE_GOAL_SEC = 10 # 进球后剪掉的秒数 POST_GOAL_CUT_SEC = 3 # 输出目录路径 OUTPUT_DIR = "../clips/" # 提前创建输出目录 os.makedirs(OUTPUT_DIR, exist_ok=True) detectedGoalList = [] with open("detected.csv", "r", encoding="utf-8") as f: for line in f: # 去掉每行首尾的双引号,直接解析为Python列表 line_content = line.strip().strip('"') try: file_path, frame_num = ast.literal_eval(line_content) detectedGoalList.append([file_path, int(frame_num)]) except Exception as e: print(f"解析行失败: {line}, 错误: {e}") continue for dg in detectedGoalList: file_path, frame_num = dg print(f"处理文件: {file_path}, 进球帧: {frame_num}") # 生成输出文件名 base_name = ntpath.basename(file_path).replace(".mp4", "")\ .replace("Rocket League®_", "").replace("Rocket League™_", "").replace("Rocket League_", "") output_path = os.path.join(OUTPUT_DIR, f"{base_name}.clipped.mp4") # 计算切割时间 start_frame = frame_num - FPS * PRE_GOAL_SEC start = max(0, start_frame / FPS) end = (frame_num / FPS) - POST_GOAL_CUT_SEC duration = end - start if duration <= 0: print(f"跳过文件{file_path}:计算得到的片段时长小于等于0") continue # 调用ffmpeg,列表传参无需处理引号 cmd = [ "ffmpeg", "-ss", str(start), "-i", file_path, "-t", str(duration), "-c", "copy", "-y", # 自动覆盖已存在的输出文件,不需要可以删掉 output_path ] print(f"执行命令: {' '.join(cmd)}") # 捕获输出并打印 result = subprocess.run(cmd, capture_output=True, text=True) print("ffmpeg输出:", result.stdout) if result.stderr: print("ffmpeg错误日志:", result.stderr)
运行验证注意事项
- 确认ffmpeg已加入系统环境变量,若未加入可将cmd列表中的
"ffmpeg"替换为ffmpeg的完整绝对路径,例如"C:/tools/ffmpeg/bin/ffmpeg.exe" - 运行脚本前确认detected.csv和脚本放在同一目录下
- 运行时会打印每一步的处理进度和ffmpeg日志,出现异常可直接根据错误日志排查
内容的提问来源于stack exchange,提问作者Mark Cornbill
相关产品推荐
相关产品推荐

