如何修复ffmpeg-python报错:ass滤镜original_size参数无效
问题:FFmpeg硬编码ASS字幕失败,报错"Error applying option 'original_size' to filter 'ass': Invalid argument"
环境
- Python 3.10
- Windows 11
- ffmpeg-python==0.2.0
背景
尝试使用FFmpeg结合Python给视频添加硬编码ASS字幕。
问题
FFmpeg无法正确识别ASS字幕文件路径,已尝试多种绝对路径、相对路径写法,以及ffmpeg-python直接调用、subprocess调用两种方式,均未解决。报错信息为:
Error applying option 'original_size' to filter 'ass': Invalid argument
测试代码
import os import ffmpeg import subprocess def add_subtitles_with_ass(video_path, ass_path, output_path): video_path = os.path.abspath(video_path) ass_path = os.path.abspath(ass_path) output_path = os.path.abspath(output_path) print(f"🚀 Add susbtitiles with ASS : {ass_path}") ass_path_escaped = rf'"{ass_path}"' try: ffmpeg.input(video_path).output(output_path, vf=f"ass='{ass_path_escaped}'").run(overwrite_output=True) print(f"✅ Subtitles added with success : {output_path}") except Exception as e: print(f"❌ ERROR when adding subtitles : {e}") def add_subtitles_with_ass_with_subprocess(video_path, ass_path, output_path): video_path = os.path.abspath(video_path) ass_path = os.path.abspath(ass_path) output_path = os.path.abspath(output_path) print(f"🚀 Add subtitles with ASS : {ass_path}") try: command = [ 'ffmpeg', '-i', video_path, '-vf', f"ass='{ass_path}'", '-c:a', 'copy', output_path, '-y' # Overwrite output file without asking ] subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(f"✅ Subtitles added with success : {output_path}") except subprocess.CalledProcessError as e: print(f"❌ ERROR when adding subtitles : {e.stderr.decode('utf-8')}") print(f"Test 1 -----------------------------------------------------------------------") ass_path="G:\Mi unidad\Python\Scripts\shorts_videos\10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path="G:\Mi unidad\Python\Scripts\shorts_videos\10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path="G:\Mi unidad\Python\Scripts\shorts_videos\10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path, ass_path, output_path) print(50*"*") print(50*"*") print(50*"*") print(f"Test 2 -----------------------------------------------------------------------") ass_path2="G:\\Mi unidad\\Python\\Scripts\\shorts_videos\\10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path2="G:\\Mi unidad\\Python\\Scripts\\shorts_videos\\10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path2="G:\\Mi unidad\\Python\\Scripts\\shorts_videos\\10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path2, ass_path2, output_path2) print(50*"*") print(50*"*") print(50*"*") print(f"Test 3 -----------------------------------------------------------------------") ass_path3="G:/\Mi unidad/\Python/\Scripts/\shorts_videos/\10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path3="G:/\Mi unidad/\Python/\Scripts/\shorts_videos/\10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path3="G:/\Mi unidad/\Python/\Scripts/\shorts_videos/\10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path3, ass_path3, output_path3) print(50*"*") print(50*"*") print(50*"*") print(f"Test 4 -----------------------------------------------------------------------") ass_path4="G:/\\Mi unidad/\\Python/\\Scripts/\\shorts_videos/\\10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path4="G:/\\Mi unidad/\\Python/\\Scripts/\\shorts_videos/\\10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path4="G:/\\Mi unidad/\\Python/\\Scripts/\\shorts_videos/\\10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path4, ass_path4, output_path4) print(f"Test 1 with subprocess -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path, ass_path, output_path) print(50*"*") print(50*"*") print(50*"*") print(f"Test 2 with subprocess -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path2, ass_path2, output_path2) print(50*"*") print(50*"*") print(50*"*") print(f"Test 3 with subprocess -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path3, ass_path3, output_path3) print(50*"*") print(50*"*") print(50*"*") print(f"Test 4 with subprocess -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path4, ass_path4, output_path4) print(50*"*") print(50*"*") print(50*"*") #======================= IT DIDN'T WORK, SO LET'S DO WITH RELATIVE PATH =================================== print(f"Test 1 with relative path -----------------------------------------------------------------------") ass_path_relative="10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path_relative="10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path_relative="10000views_and_higher\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path_relative, ass_path_relative, output_path_relative) print(50*"*") print(50*"*") print(50*"*") print(f"Test 2 with relative path -----------------------------------------------------------------------") ass_path2_relative="10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path2_relative="10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path2_relative="10000views_and_higher\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path2_relative, ass_path2_relative, output_path2_relative) print(50*"*") print(50*"*") print(50*"*") print(f"Test 3 with relative path -----------------------------------------------------------------------") ass_path3_relative="10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path3_relative="10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path3_relative="10000views_and_higher/\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path3_relative, ass_path3_relative, output_path3_relative) print(50*"*") print(50*"*") print(50*"*") print(f"Test 4 with relative path -----------------------------------------------------------------------") ass_path4_relative="10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.ass" video_path4_relative="10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo.mp4" output_path4_relative="10000views_and_higher/\\Li2zY7XcOf0_Matthew_Hussey_flip_h_BW_with_logo_EN.mp4" add_subtitles_with_ass(video_path4_relative, ass_path4_relative, output_path4_relative) print(f"Test 1 with subprocess with relative path -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path, ass_path, output_path) print(50*"*") print(50*"*") print(50*"*") print(f"Test 2 with subprocess with relative path -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path2_relative, ass_path2_relative, output_path2_relative) print(50*"*") print(50*"*") print(50*"*") print(f"Test 3 with subprocess with relative path -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path3_relative, ass_path3_relative, output_path3_relative) print(50*"*") print(50*"*") print(50*"*") print(f"Test 4 with subprocess with relative path -----------------------------------------------------------------------") add_subtitles_with_ass_with_subprocess(video_path4_relative, ass_path4_relative, output_path4_relative) print(50*"*") print(50*"*") print(50*"*")
输出
输出内容较多,包含详细报错信息及测试过程记录。
解决方案
1. 修正路径转义逻辑
代码中手动给路径添加多层引号导致ffmpeg解析参数错误,正确处理方式:
- ffmpeg-python调用:无需手动添加引号,直接传递路径字符串,ffmpeg-python会自动处理带空格的路径转义;
- subprocess调用:直接将路径作为列表元素传入,subprocess会自动处理空格转义,不需要在参数中添加额外引号。
修正后的核心代码:
# ffmpeg-python方式 ffmpeg.input(video_path).output(output_path, vf=f"ass={ass_path}", **{'c:a': 'copy', 'c:v': 'libx264'}).run(overwrite_output=True) # subprocess方式 command = [ 'ffmpeg', '-i', video_path, '-vf', f"ass={ass_path}", '-c:a', 'copy', '-c:v', 'libx264', '-y', output_path ]
2. 检查ASS字幕文件参数
报错中的original_size来自ASS文件的配置,若ASS文件[Script Info]部分的PlayResX/PlayResY格式错误,或存在无效的original_size参数,会导致ffmpeg报错。可以:
- 打开ASS文件,删除
original_size相关行,ffmpeg会自动适配视频分辨率; - 确保
PlayResX和PlayResY为有效整数(如PlayResX=1080、PlayResY=1920)。
3. 更新FFmpeg版本
老旧版本FFmpeg对ASS滤镜的参数兼容性较差,建议更新至最新稳定版,避免参数解析bug。
内容的提问来源于stack exchange,提问作者Gauthier Buttez
相关产品推荐
相关产品推荐

