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

相同Python代码调用FFmpeg合并音视频偶发返回invalid argument错误

问题原因

  • 核心触发点是你直接使用了pytube返回的视频title作为输出文件名,Windows系统不允许文件名包含双引号(")、冒号(:)、斜杠(//\)等特殊字符。从报错日志里的输出路径D:/videos/mp4\Dropkick Murphys - "Rose Tattoo" (Video).mp4就能看到,title里带了双引号,转义后变成了非法字符,ffmpeg识别后就会返回invalid argument错误。
  • 次要问题是你的代码重复多次调用video.streams.filter(),既降低效率,也可能因为索引取值不稳定触发报错,比如部分视频的音频流数量不足2条时,索引[1]会直接越界。

解决方案

1. 先对文件名做非法字符清洗

写个工具函数把Windows文件名不允许的字符全部替换为合法字符,再用清洗后的字符串作为输出文件名。

2. 优化stream读取逻辑,避免重复调用filter

修改后的代码如下:

import os
import subprocess
import re

# 文件名非法字符清洗函数
def clean_filename(filename):
    # 匹配Windows系统不允许的文件名特殊字符
    invalid_chars = r'[\\/:*?"<>|]'
    # 把非法字符替换成下划线
    return re.sub(invalid_chars, '_', filename)

for video in p.videos:
    # 提前获取需要的stream,避免重复filter
    video_stream = video.streams.filter(file_extension='mp4', resolution='480p')[0]
    # 优先取最高质量的音频流,不用固定索引[1]避免越界
    audio_stream = video.streams.filter(only_audio=True).order_by('abr').desc()[0]
    
    # 下载音视频文件,download方法会直接返回文件完整路径,无需手动拼接
    video_path = video_stream.download(os.path.join(parent_dir, 'mp4/processing/video'))
    audio_path = audio_stream.download(os.path.join(parent_dir, 'mp4/processing/audio'))
    
    # 清洗输出文件名
    output_filename = clean_filename(video_stream.title) + '.mp4'
    output_path = os.path.join(parent_dir, 'mp4', output_filename)
    
    # 调用ffmpeg合并
    subprocess.run([
        r'c:\FFmpeg\bin\ffmpeg',
        '-i', video_path,
        '-i', audio_path,
        '-c:v', 'copy',
        '-c:a', 'copy',
        # 加上-y参数可以自动覆盖已存在的同名文件,避免交互阻塞
        '-y',
        output_path
    ])

内容的提问来源于stack exchange,提问作者Gustavo Marinho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:39:01