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

使用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()
)

关键说明

  1. 转义逻辑:ffmpeg-python会将参数作为独立项传递给FFmpeg,无需像shell环境那样转义逗号,直接使用表达式原生语法即可。
  2. 路径校验:确保字体文件的绝对路径完整,避免因路径缺失导致FFmpeg加载字体失败。
  3. 编码参数:添加与终端命令一致的编码参数,保证输出视频的格式兼容性和质量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:30:04