如何在字幕文件中加载外部或自定义字体

Posted

技术标签:

【中文标题】如何在字幕文件中加载外部或自定义字体【英文标题】:How to load external or custom fonts in subtitle file 【发布时间】:2020-11-18 18:20:46 【问题描述】:

如何从外部文件路径/自定义路径加载 .ass 字幕文件中的字体?假设我在一个文件夹中有一个字体,我需要将该字体加载到字幕文件(.ass)文件中。如何加载它?有没有可能? FFmpeg 命令是

ffmpeg -i sample.mp4 -map 0 -vf "subtitles=test.ass:fontsdir=Dancing_Script.ttf" -c:a copy output.mp4

上面是我的 .ass 文件

[Script Info]
; Script generated by Aegisub 3.2.2
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: None

[Aegisub Project Garbage]

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,8,10,10,10,1


[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,,first\fnDancing Script\b0

问题是视频仍在加载 Arial 字体,即使我使用 \fnDancing Script\b0

加载

【问题讨论】:

【参考方案1】:

软潜艇

为 ASS 文件中的特定字体命名。字体名称在Style 行中。在此示例中,字体名称为 Liberation Sans

Style: Default,Liberation Sans,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,8,10,10,10,1

ffmpeg附上字幕和字体文件:

ffmpeg -i input.mkv -i subtitles.ass -attach LiberationSans-Regular.ttf -map 0 -map 1 -metadata:s:t mimetype=application/x-truetype-font -c copy output.mkv

硬分叉

将subtitles filter 与fontsdirforce_style 选项一起使用。

ffmpeg -i input.mp4 -map 0 -vf "subtitles=/path/to/your/subtitles.ass:fontsdir=/path/to/your/font/directory:force_style='Fontname=Liberation Sans'" -c:a copy output.mp4
建议将字体文件单独放在指定的fontsdir中。否则ffmpeg 将需要很长时间加载指定fontsdir 中的所有 文件。 这适用于基于文本的字幕格式,例如 ASS、SRT 和 VTT。 您可以直接编辑 ASS 文件中的Fontname,而不是使用force_style,如上所示。

多种字体样式

使用\fn override tag 使特定单词或句子使用不同的字体。

Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,,This is \fnDancing Scriptone font style\fn and this is \fnArialanother font style\fn

【讨论】:

如何使用以下 cmd ffmpeg -i input.mkv -vf "subtitles=subs.ass" -c:a copy output.mkv 附加 ttf @KonduriSaiAditya 查看更新的答案。不清楚你想要软潜艇还是硬潜艇,所以我最初不得不猜测。 谢谢,如果我想为不同的文本加载单独的字体怎么办,如何格式化 .ass 文件和 ffmpeg 命令 @KonduriSaiAditya 查看 ASS 文件的 \fn override tag,如果它也是系统“外部”的,请确保字体文件位于指定的 fontsdir 中。 @KonduriSaiAditya 查看更新的答案。原始问题中并不清楚您是否需要多种字体样式。【参考方案2】:

这个东西很常见,但一开始我有点失望,因为尝试查找时与之相关的搜索结果很少。

llogan 的回答可能是正确的,但我对其进行了一些更改以使其对我有用,在这里我将分享它,以便可能有人觉得它有用。

这不是一个完整的示例,因为我猜您已经在视频中添加了 .ass 字体文件。正如lllogan所说,你可以像这样指定字体目录。

ass=./subt/113.ass:fontsdir=./fonts/

然后,您可以使用直接放置在 .ass 文件文件夹中的任何“.ttf”字体文件。像这样。

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,FONT-NAME,40,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,0,0,2,40,40,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:03.55,Default,,0,0,0,,\fnFONT-NAME\fs28This is an example text.

在上面的示例中,我假设 FONT-NAME 是一种放在./fonts/ 文件夹中的字体。我使用 FONT-NAME 这是字体名称,(不是带有 .ttf 扩展名的文件名。)

【讨论】:

以上是关于如何在字幕文件中加载外部或自定义字体的主要内容,如果未能解决你的问题,请参考以下文章

Android:在 SD 卡中加载自定义字体

属性标题未在 xib 文件的 UIButton 中加载自定义字体

Tailwind 无法在 Laravel 中加载我的自定义字体

RuntimeException:无法制作本机字体或自定义 TextView 加载字体的内存泄漏

如何将自定义字体设置为 android 工具栏的字幕?

我可以在包中嵌入自定义字体并从 ios 框架访问它吗?