使用Python调用FFmpeg给MKV添加字幕时路径报错求助
解决Python调用FFmpeg为MKV添加字幕的路径错误问题
错误原因分析
从报错信息里的Unable to parse option value "UsersclaraDocumentsProyectosSubtitulossubtitulos..." as image size可以看出:Windows路径的反斜杠被转义后消失,导致路径变成无分隔符的连续字符串,FFmpeg误将其识别为subtitles滤镜的original_size参数值,从而触发参数无效的错误。
解决方案
方案1:修正路径转义问题
将Windows路径的反斜杠替换为正斜杠,同时避免在滤镜字符串中使用单引号包裹路径:
import os from fuzzywuzzy import fuzz import ffmpeg for video_file, (video, subtitle) in video_subtitle_mapping.items(): print(f"Video: {video_file}, Subtitle: {subtitle}") # 构建字幕、视频和输出路径 subtitulo_file = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\subtitulos", subtitle) video_path = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\videos", video_file) output_video_file = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\videos_con_subtitulos", video_file) # 将Windows反斜杠替换为正斜杠,避免转义问题 subtitulo_file = subtitulo_file.replace("\\", "/") video_path = video_path.replace("\\", "/") try: # 直接传递路径,无需额外单引号包裹 ffmpeg.input(video_path).output(output_video_file, vf=f"subtitles={subtitulo_file}").run() except ffmpeg.Error as e: # 解码stderr输出为可读字符串 print(f"Error processing video {video_file}: {e.stderr.decode('utf-8')}")
方案2:使用FFmpeg-Python的filter方法(推荐)
直接调用filter()方法传递字幕参数,完全避免字符串转义问题:
import os from fuzzywuzzy import fuzz import ffmpeg for video_file, (video, subtitle) in video_subtitle_mapping.items(): print(f"Video: {video_file}, Subtitle: {subtitle}") # 构建路径 subtitulo_file = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\subtitulos", subtitle) video_path = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\videos", video_file) output_video_file = os.path.join(r"C:\Users\clara\Documents\Proyectos\Subtitulos\videos_con_subtitulos", video_file) try: # 使用filter方法配置字幕滤镜,无需手动处理字符串转义 stream = ffmpeg.input(video_path) stream = ffmpeg.filter(stream, 'subtitles', filename=subtitulo_file) ffmpeg.output(stream, output_video_file).run() except ffmpeg.Error as e: print(f"Error processing video {video_file}: {e.stderr.decode('utf-8')}")
额外提示
- 如果输出文件已存在,FFmpeg默认会报错,可以在
output()方法中添加overwrite_output=True参数覆盖已有文件:ffmpeg.output(stream, output_video_file, overwrite_output=True).run() - 确保FFmpeg已正确添加到系统环境变量中,或者在代码中指定FFmpeg的路径:
ffmpeg.input(video_path, cmd=r"C:\path\to\ffmpeg.exe")
内容的提问来源于stack exchange,提问作者Clara Ogalla
相关产品推荐
相关产品推荐

