ffmpeg 烧录字幕以错误的字体呈现

问题描述 投票:0回答:4

尝试以 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)

有什么想法吗?

更新:在 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”的文件正确传递给字体名称:GothamPro-Bold 或只是 Gotham Pro。 Gotham Pro Bold、GothamPro、Gotham Pro-Bold、GothaProBol 和 GothaProBol.otf 不起作用。

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

也就是说,我在与 Gotham Pro 相同的文件夹中有一种新颖的“权力的游戏.ttf”字体,并且我无法在上述任何命名约定下让 CoreText 连接到它。

python c ffmpeg libav
4个回答
4
投票

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

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

2
投票

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

我的项目本地文件夹中也有字体文件。

(./fonts)
并且更改字体文件名或使用 Mac 的 Font-Book 中显示的字体名称不起作用。

这就是我如何让它发挥作用......

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

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

  3. 您可以在顶部看到字体名称

  4. 使用与您所看到的字体名称完全相同的FFMPEGforce_style参数

    fontsdir='./fonts',force_style='FontName=HelveticaRoundedLTStd-BdCn,PrimaryColour=0x7FFFD4,Fontsize= 26

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

希望这有帮助🚀🚀🚀


0
投票

我整个晚上都在尝试解决同样的问题,终于解决了。

OP 说“权力的游戏.ttf”不起作用,但“GothaProBol.otf”起作用。

所以我使用在线工具将我的自定义字体从 .ttf 转换为 .otf

然后将我的自定义字体复制到/Library/Fonts/fontname.otf

然后使用字体书中的 POSTSCRIPT-NAME,效果非常好:-)

ffmpeg -i input.mp4 -vf "subtitles=subtitle.ass:force_style='Fontname=CUSTOMfontBlack-Regular'" output.mp4

0
投票

我有类似的问题,但我通过按原样使用字体名称解决了它。

Bourgeois-UltraBold-Condensed.ttf
将会是
...force_style='FontName=Bourgeois UltraBold Condensed'...

© www.soinside.com 2019 - 2024. All rights reserved.