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 中显示的字体名称不会没用。
这就是我如何让它工作的...
在 Font Forge 中打开字体文件,您可以在此处下载 - FontForge.
单击元素选项卡,然后单击字体信息
上面可以看到字体名称
使用您在 FFMPEG force_style 参数中看到的字体名称
fontsdir='./fonts',force_style='FontName=HelveticaRoundedLTStd-BdCn,PrimaryColour=0x7FFFD4,Fontsize= 26
这是我的终端日志,显示它正在加载自定义字体。
希望对您有所帮助
正在尝试以 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 中显示的字体名称不会没用。
这就是我如何让它工作的...
在 Font Forge 中打开字体文件,您可以在此处下载 - FontForge.
单击元素选项卡,然后单击字体信息
上面可以看到字体名称
使用您在 FFMPEG force_style 参数中看到的字体名称
fontsdir='./fonts',force_style='FontName=HelveticaRoundedLTStd-BdCn,PrimaryColour=0x7FFFD4,Fontsize= 26
这是我的终端日志,显示它正在加载自定义字体。
希望对您有所帮助