ffmpeg-python中-vf的movie滤镜如何正确指定临时水印文件路径?
解决ffmpeg-python临时水印文件路径解析问题
问题场景
使用ffmpeg-python为视频添加水印时,通过tempfile创建临时PNG文件并写入io.BytesIO内容,执行run()时ffmpeg报错无法识别临时文件路径,但将水印文件复制到工作区后使用相对路径即可正常运行。
错误原因
Windows系统路径中的反斜杠\在字符串拼接时会被当作转义字符处理,导致ffmpeg解析路径时被截断(例如C:\Users\...会被误解析为C),最终触发文件找不到的错误。
修复方案
方案1:转义路径中的反斜杠
手动将临时文件路径中的反斜杠替换为双反斜杠,或使用原始字符串保留路径格式:
import tempfile import os import uuid import ffmpeg with tempfile.TemporaryFile("wb", delete=False, suffix=".png") as watermark_file: watermark_file.write(buff.read()) # 转义路径中的反斜杠,避免被当作转义字符 watermark_path = watermark_file.name.replace("\\", "\\\\") # 或使用原始字符串:watermark_path = r"{}".format(watermark_file.name) # 用os.path.join安全拼接输出路径 output_path = os.path.join(os.environ.get("TEMP"), f"{uuid.hex}_{path.name}") ( ffmpeg .input(str(path)) .output( output_path, vf=f"movie='{watermark_path}' [watermark]; [in][watermark] overlay='{overlay}' [out]" ) .global_args('-copyts') .run() )
方案2:使用ffmpeg-python原生滤镜API(推荐)
避免手动拼接滤镜字符串,用ffmpeg-python的overlay滤镜直接构造,从根源解决路径转义问题:
import tempfile import os import uuid import ffmpeg with tempfile.TemporaryFile("wb", delete=False, suffix=".png") as watermark_file: watermark_file.write(buff.read()) output_path = os.path.join(os.environ.get("TEMP"), f"{uuid.hex}_{path.name}") # 分别构造视频输入和水印输入 video_input = ffmpeg.input(str(path)) watermark_input = ffmpeg.input(watermark_file.name) # 使用overlay滤镜合并,替换overlay_x/overlay_y为实际坐标(比如10,10) ( ffmpeg .overlay(video_input, watermark_input, x=overlay_x, y=overlay_y) .output(output_path) .global_args('-copyts') .run() )
若原
overlay参数是表达式(例如W-w-10:H-h-10),可直接传入x和y参数:x="W-w-10", y="H-h-10"
额外优化
- 用
os.path.join拼接路径,替代直接字符串相加,自动适配不同系统的路径分隔符。 - 若临时文件使用后无需保留,可在执行完ffmpeg后手动删除:
os.unlink(watermark_file.name)
内容的提问来源于stack exchange,提问作者Wintreist
相关产品推荐
相关产品推荐

