FFmpeg drawtext滤镜无法通过绝对路径加载指定字体的问题求助
FFmpeg drawtext滤镜无法通过绝对路径加载指定字体的问题求助
各位大佬好,我最近写了个Python脚本,用来生成一段简单视频——就是用一段MP3音频搭配屏幕上的固定文本。现在我想加个功能,让用户可以指定字体类型来格式化视频里的文本,但折腾了好久都没搞定,想请大家帮我看看问题出在哪。
先贴一下我的核心代码:
import subprocess from pathlib import Path from myproject import AUDIOS_FOLDER, FONTS_FOLDER font_name = "Montserrat-LightItalic" font_path = str(FONTS_FOLDER / font_name) + '.ttf' assert Path(font_path).is_file() ffmpeg_command = [ 'ffmpeg', '-y', '-f', 'lavfi', '-i', 'color=c=gray:s=640x480:d=4', '-i', f'{str(AUDIOS_FOLDER / "i_have_a_cat.mp3")}', '-vf', f'drawtext=text=\'I have a cat\':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile=\'{font_path}\'', str(ffmpeg_poc_path / 'output.mp4') ] subprocess.run(ffmpeg_command)
遇到的问题
不管我怎么设置fontfile参数,它都好像没生效——加不加这个参数,生成的视频文本字体都是默认的,完全没变化。
我已经尝试过的方法,全都没用:
- 直接用系统默认字体的文件名,比如
fontfile=\'arialbd.ttf\'或者fontfile=\'sseriff.ttf\',这些字体确实存在于我的C:\Windows\Fonts目录里,但就是不生效 - 各种引号组合都试过了:
:fontfile='sseriff.ttf' :fontfile=\'sseriff.ttf\' :fontfile="sseriff.ttf" :fontfile=\"sseriff.ttf\" - 按照网上的建议转义路径格式:把反斜杠替换成双反斜杠,还把
C:改成C\:,比如转义后的路径是C\:\\user\\OneDrive\\Desktop\\myproject\\fonts\\Montserrat-LightItalic.ttf,依然没用
目前唯一能生效的方法,但不符合需求
后来我把字体文件复制到了脚本的工作目录里,直接写fontfile=arialbd.ttf(注意这里不能加引号,加了就失效),这样倒是能正常加载指定字体了。但我需要的是通过绝对路径加载任意位置的字体,这个方法没法满足我的需求。
比如下面这段用绝对路径的代码还是不行:
font_path = FONTS_FOLDER / "arialbd.ttf" assert font_path.is_file() font_path_str = str(font_path) # 路径示例:c:\user\OneDrive\myproject\fonts\arialbd.ttf ffmpeg_command = [ 'ffmpeg', '-y', '-f', 'lavfi', '-i', 'color=c=gray:s=640x480:d=4', '-i', f'{str(audios_path / "i_have_a_cat.mp3")}', '-vf', f'drawtext=text=\'I have a cat\':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile={font_path_str}', str(ffmpeg_poc_path / 'output.mp4') ]
我也试过再次转义路径里的反斜杠和C:,还是没效果。
有没有大佬知道这到底是哪里出问题了?怎么才能让drawtext滤镜通过绝对路径正确加载字体呢?
备注:内容来源于stack exchange,提问作者lazarea
相关产品推荐
相关产品推荐

