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

Python调用FFmpeg执行字幕滤镜报错,命令行执行正常

问题:命令行正常的FFmpeg字幕转码命令在Python中报错

命令行执行以下命令可正常将带字幕的MKV转成MP4:

./ffmpeg.exe -i "video.mkv" -vf subtitles="video.mkv" "video.mp4"

但用Python的subprocess执行相同逻辑时出现错误,Python代码如下:

from pathlib import Path
import subprocess
import os

ffmpeg = r"D:\Archives\ffmpeg.exe"
os.chdir(r"D:\temp\video")
videos = Path(".")

for file_mkv in videos.glob("*.mkv"):
    file_mp4 = file_mkv.with_suffix(".mp4")
    subprocess.run([ffmpeg, "-i", file_mkv, "-vf", f'subtitles="{file_mkv}"', file_mp4])

错误信息(中文翻译)

[Parsed_subtitles_0 @ 0000020cb26222c0] 无法打开 "video.mkv"
[AVFilterGraph @ 0000020cb715a380] 初始化滤镜 'subtitles' 时出错,参数为 '"video.mkv"'
重新初始化滤镜失败!
向滤镜网络注入帧失败:无效参数
处理流 #0:0 的解码数据时出错
转换失败!

解决方案

问题出在subprocess.run的参数传递逻辑上:命令行里的引号是用来让shell识别完整文件名,而subprocess用列表传参时,不需要额外添加引号。你当前代码给subtitles参数加了双引号,导致FFmpeg把带引号的字符串当作文件名查找,自然找不到目标文件。

修改代码中-vf的参数部分,去掉多余的引号即可:

subprocess.run([ffmpeg, "-i", file_mkv, "-vf", f'subtitles={file_mkv}', file_mp4])

另外,file_mkv是Path对象,subprocess会自动将其转换为字符串,无需额外处理。如果文件名包含空格,subprocess的列表传参方式会自动处理空格问题,不用手动加引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:51:29