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
相关产品推荐
相关产品推荐

