相同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
相关产品推荐
相关产品推荐

