我设置了一个脚本,该脚本可生成一个简单的视频,其中包含一个 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=\'{font_path}\'
设置没有被激活。上面的代码产生的输出与我完全删除该部分时产生的输出完全相同:fontfile=\'{font_path}\'
。
我尝试使用不使用的替代字体名称font_path
,例如:
'-vf', f'drawtext=text=\'I have a cat\':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile=\'arialbd.ttf\''
或者
'-vf', f'drawtext=text=\'I have a cat\':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile=\'sseriff.ttf\''
但这些也不起作用,尽管这两个文件都存在于C:\Windows\Fonts
我的本地设备上。所以在这个阶段,我得出结论,系统默认字体和自定义安装的项目特定字体都不起作用。
注 1:我也尝试过使用和不使用单引号和双引号,但都没有成功:
:fontfile='sseriff.ttf'
:fontfile=\'sseriff.ttf\'
:fontfile="sseriff.ttf"
:fontfile=\"sseriff.ttf\"
注 2:至于我打算收集在以下project_root/fonts
目录中的项目特定字体,我偶然发现了此评论我按照这里的建议改变了路径;但没有成功:
font_path = font_path.replace("\\", "\\\\").replace("C:", "C\:")
# example result: C\:\\user\\OneDrive\\Desktop\\myproject\\fonts\\Montserrat-LightItalic.ttf
注 3:根据 Rotem 的以下建议,我将自定义字体文件复制C:\Windows\Fonts
到我的工作目录中。在下面的情况下,我使用了arialbd.ttf
自定义字体:
'-vf', f'drawtext=text=\'I have a cat\':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile=arialbd.ttf'
请注意,文件名周围不应使用引号;否则,字体将不会被应用。
虽然这种方法很完美,但我仍然无法通过绝对路径引用任意字体类型。以下方法不起作用:
font_path = FONTS_FOLDER / "arialbd.ttf"
assert font_path.is_file()
font_path_str = str(font_path)
# path looks like this: 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:\
为C\:\
但仍然没有成功。
答案1
我设法修好了它。
看来,当我们指定.ttf
工作目录中的文件时,不需要引号:
-vf drawtext=text=\'I have a cat\':fontfile=arialbd.ttf'
但是,在指定文件的绝对路径时.ttf
,必须在路径周围添加转义的单引号,并转义所有反斜杠和冒号:
-vf drawtext=text=\'I have a cat\':fontfile=\'C\:\\user\\OneDrive\\myproject\\fonts\\arialbd.ttf\''