ffmpeg 内置字幕以错误的字体呈现

ffmpeg burned-in subtitles render in the wrong font

正在尝试以 GothamProBold 字体将字幕刻录到 FFMPEG 视频中。无论我做什么,它都会恢复为 Helvetica。从控制台,我看到 FFMPEG 似乎加载字体没有错误。然后切换到字体提供程序“coretext”

[Parsed_subtitles_0 @ 0x7fed054048c0] Loading font file '/Projects/Fonts/GothaProBol.otf'
[Parsed_subtitles_0 @ 0x7fed054048c0] Using font provider coretext
[Parsed_subtitles_0 @ 0x7fed054048c0] fontselect: (GothaProBol.otf, 400, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica

它似乎加载了我的字体,然后加载了可能是系统默认的 Helvetica。我的猜测是我选择的字体毕竟实际上 没有加载。

FFMPEG命令(从python调用)如下:

ffmpeg_cmd = ["ffmpeg", 
              "-i", self.source_video_uri, 
              "-y",
              "-c:v", "prores", "-profile:v", "1", 
              "-c:a", "pcm_s16be", 
              "-vf", f"subtitles={srt_uri}:fontsdir=/Projects/Fonts:force_style='Fontname=GothaProBol.otf'",
              f"{self.source_video_uri}_render.mov"]

subprocess.call(ffmpeg_cmd)

有什么想法吗?

UPDATE:在 libass 头文件“ass.h”中找到此设置 - ffmpeg 在使用字幕过滤器时会调用它。当 ffmpeg 调用 libass 时,不知道如何实际 set 这个变量,但在这里。第 182 行:

 * \brief Default Font provider to load fonts in libass' database
 *
 * NONE don't use any default font provider for font lookup
 * AUTODETECT use the first available font provider
 * CORETEXT force a CoreText based font provider (OS X only)
 * FONTCONFIG force a Fontconfig based font provider
 *
 * libass uses the best shaper available by default.
 */
typedef enum {
    ASS_FONTPROVIDER_NONE       = 0,
    ASS_FONTPROVIDER_AUTODETECT = 1,
    ASS_FONTPROVIDER_CORETEXT,
    ASS_FONTPROVIDER_FONTCONFIG,
    ASS_FONTPROVIDER_DIRECTWRITE,
} ASS_DefaultFontProvider;

回复:下面的回答: 在大多数情况下,如果您的字体安装在 /System/Fonts 或 /Library/Fonts 中,那么 CoreText 似乎可以找到它.尽管在某些情况下,命名约定可能非常特殊且不直观。它似乎也不一定能找到所有字体。

例如:Gotham Pro Bold,在我系统的 /Library/Fonts 文件夹中,名为“GothaProBol.otf”的文件 正确地 传递给 fontname 为: GothamPro-Bold 或只是 Gotham Pro。 Gotham Pro Bold、GothamPro、Gotham Pro-Bold、GothaProBol 和 GothaProBol.otf 不起作用。

对于大多数字体,似乎首选的约定是在 Mac OS 的 FontBook 中显示的 {FontName}-{Style/Weight},而不是文件名。

就是说,我在 Gotham Pro 所在的文件夹中有一个新奇的 'Game of Thrones.ttf' 字体,但根据上述任何命名约定,我都无法让 CoreText 连接到它。

不要将文件扩展名放在字体名称中:

force_style='fontname=GothamPro-Bold'

在我的例子中,我得到了一个名为 GothamPro-Bold.otf 的文件,输出如下:

[Parsed_subtitles_0 @ 0x55c809fd73c0] Shaper: FriBidi 0.19.7 (SIMPLE) HarfBuzz-ng 2.6.4 (COMPLEX)
[Parsed_subtitles_0 @ 0x55c809fd73c0] Loading font file './fonts/GothamPro-Bold.otf'
[Parsed_subtitles_0 @ 0x55c809fd73c0] Using font provider fontconfig
[Parsed_subtitles_0 @ 0x55c809fd73c0] fontselect: (GothamPro-Bold, 400, 0) -> GothamPro-Bold, 0, GothamPro-Bold

我在 FFMPEG 字幕过滤器 中使用了自定义字体。 (我正在使用 Mac 和 FFMPEG-PYTHON,它们只是 FFMPEG 的包装器).

我的项目本地文件夹中也有字体文件。(./fonts) 更改字体文件名或使用 Mac 的 Font-Book 中显示的字体名称不会没用。

这就是我如何让它工作的...

  1. 在 Font Forge 中打开字体文件,您可以在此处下载 - FontForge.

  2. 单击元素选项卡,然后单击字体信息

  3. 上面可以看到字体名称

  4. 使用您在 FFMPEG force_style 参数中看到的字体名称 fontsdir='./fonts',force_style='FontName=HelveticaRoundedLTStd-BdCn,PrimaryColour=0x7FFFD4,Fontsize= 26

这是我的终端日志,显示它正在加载自定义字体。

希望对您有所帮助