使用Python调用FFmpeg添加动态文本失败,求解决方案
解决Python调用FFmpeg添加动态文本失败的问题
问题分析
你在Python中使用ffmpeg-python库调用FFmpeg添加动态文本时失败,但终端直接执行命令能成功,核心问题集中在转义处理错误、路径缺失以及编码参数遗漏三个方面。
错误点拆解
第一种实现的问题
- 过度转义逗号:
ffmpeg-python会自动处理参数传递,无需像shell命令那样转义逗号,你写的x='if (eq(mod(t\\, 15)\\, 0)\\, rand(0\\, (w-text_w))\\, x)'中双重反斜杠属于多余操作,会导致FFmpeg无法正确解析表达式。 - 缺少编码参数:终端命令中指定了
-c:a copy(复制音频流)和-c:v libx264等编码参数,Python代码未添加这些参数可能引发输出格式不兼容问题。
第二种实现的问题
- 字体路径错误:
fontfile=':\projects\python\editor_bot\downloads\Candara.ttf'缺少盘符D:\,FFmpeg无法定位字体文件。 - 字符串格式混乱:使用
fr字符串时,内部单引号与转义逻辑冲突,且filter_complex的参数格式不够规范。
修正后的代码
方法一:直接使用filter添加drawtext
( ffmpeg .input(in_video) .filter('drawtext', fontsize=30, fontfile=r"D:\projects\python\editor_bot\downloads\Candara.ttf", text='test test test.', # 移除多余反斜杠,直接使用表达式原生逗号 x='if(eq(mod(t,15),0),rand(0,(w-text_w)),x)', y='if(eq(mod(t,10),0),rand(0,(h-text_h)),y)') # 补充终端命令中的编码参数,保证输出兼容性 .output(f'output-final.mp4', vcodec='libx264', acodec='copy', preset='slow', crf=18) .run() )
方法二:使用filter_complex实现
# 修正字体路径,直接使用表达式原生逗号(无需转义) fil = "drawtext=text='test test test':fontsize=30:fontfile='D:\\projects\\python\\editor_bot\\downloads\\Candara.ttf':x='if(eq(mod(t,15),0),rand(0,(w-text_w)),x)':y='if(eq(mod(t,10),0),rand(0,(h-text_h)),y)'" ( ffmpeg .input(in_video) .output(f'output-final.mkv', filter_complex=fil, vcodec='libx264', acodec='copy', preset='slow', crf=18) .run() )
关键说明
- 转义逻辑:
ffmpeg-python会将参数作为独立项传递给FFmpeg,无需像shell环境那样转义逗号,直接使用表达式原生语法即可。 - 路径校验:确保字体文件的绝对路径完整,避免因路径缺失导致FFmpeg加载字体失败。
- 编码参数:添加与终端命令一致的编码参数,保证输出视频的格式兼容性和质量。
内容的提问来源于stack exchange,提问作者Wolf Wolf
相关产品推荐
相关产品推荐

