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

Python调用FFmpeg切割火箭联盟游戏录像无输出问题排查

火箭联盟进球剪辑脚本故障修复方案

故障根因

  1. CSV解析逻辑不可靠:仅通过简单字符串替换处理结构化的列表格式内容,容易出现引号、转义符残留,导致读取的文件路径、帧号格式错误,ffmpeg识别输入文件失败。
  2. 输出目录未提前校验:如果脚本上级目录的clips文件夹不存在,ffmpeg写入输出文件时会直接失败,而os.system调用不会抛出Python层面的错误,也默认不打印ffmpeg的报错日志。
  3. 路径传参方式存在兼容问题:手动给路径加双引号的方式在Windows环境下容易出现转义异常,尤其路径包含空格、特殊符号时大概率失效。
  4. 帧率计算未完全适配:原脚本所有时间计算都基于30fps,切换60fps需要替换所有帧率相关的常量,仅替换部分不会生效。
  5. 可选故障点:若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:36:00