我正在抓取我想要用于文件格式 .ASS 的文本坐标并以 1080 x 1920 视频为中心,我有一个应用程序可以显示文本在视频上的位置并可以检索位置,例如居中位置为 310 x 800。当我尝试使用这些位置设置 .ASS 内文本的位置时,它不会将标题写入应有的位置。有人可以解释一下 .ASS 定位是如何工作的吗?如果使用 200 px x 200 px 作为定位,即使视频是 1080x1920 视频,它也会比中心位置更远,难道它不应该放置在视频中心位置之前吗?
这就是我的 .ASS 文件的样子,我使用 ffmpeg 将字幕写入视频中:
[Script Info]
Title: Video Subtitles
ScriptType: v4.00+
Collisions: Normal
PlayDepth: 0
PlayResX: 1080
PlayResY: 1920
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BorderStyle, Encoding
Style: Default, Segoe UI,9,&H00FFFFFF,&HFFFF00,&H00FFFFFF,0,0
Style: Background, Segoe UI,9,&H00FFFFFF,&H000000FF,&H00000000,3,0
[Events]
Format: Start, End, Style, MarginL, MarginR, MarginV, Text
Dialogue: 0:00:00.00,0:00:05.00,Default,0,0,0,{\pos(275,876)} {\bord5\3c&H000000&\fs90}LISTEN IN {\r}
FFmpeg 使用 Libass 作为 ASS 字幕渲染器。如果没有
PlayResX
和 PlayResY
标头,则假定分辨率为 384x288 像素(我相信其他渲染器(例如 VSFilter 及其变体,例如 xyVSFilter)也是这种情况)。由于您的 ASS 文件缺少这些标头,因此实际中心将位于 x 轴上的 192 像素和 y 轴上的 144 像素处。 (所以它会是 \pos(192,144)
但最好设置这些标头,而不是通过将它们包含到
[Script Info]
: 来计算 384x288 的基础
PlayResX: 1080
PlayResY: 1920
但是,文本仍然不会完全居中,因为锚点(对齐)位于字幕文本的左下角。因此,您的样式应该考虑到这一点,如下所示:
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BorderStyle, Encoding, Alignment
Style: Default,Segoe UI,45,&HFFB0B0,&HFFFF00,&H998877,0,0,2
Style: Background,Segoe UI,45,&H00FFFFFF,&H000000FF,&H00000000,3,0,2
设置对齐方式的另一种方法是使用 n 覆盖标签,例如(在您的情况下为 n2),可能的值为:
这些对齐数字 1-9 在
Alignment
标题字段中以相同的方式应用,因此这就是样式中的 2 的来源。
所以你的 ASS 文件的内容应该如下所示:
[Script Info]
Title: Video Subtitles
ScriptType: v4.00+
Collisions: Normal
PlayDepth: 0
PlayResX: 1080
PlayResY: 1920
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BorderStyle, Encoding, Alignment
Style: Default,Segoe UI,45,&HFFB0B0,&HFFFF00,&H998877,0,0,2
Style: Background,Segoe UI,45,&H00FFFFFF,&H000000FF,&H00000000,3,0,2
[Events]
Format: Start, End, Style, MarginL, MarginR, MarginV, Text
Dialogue: 0:00:00.00,0:00:05.00,Default,0,0,0,{\pos(540,800)}LISTEN IN
编辑:
根据您的评论,您似乎觉得不能同时使用对齐和位置,而实际上它是您问题的解决方案,因为它们是截然不同的东西(因此可以同时使用) ),因此要使文本居中,您需要
\pos(max_x/2,any_y)
和 2
(中心-底部)、5
(中心-中心)或 8
(顶部-中心)对齐 ( n),我建议使用那里有价值2
。如果您想将其放置在屏幕上的任何位置,则同样适用,例如 {\an2\pos(200,200)}text
将居中,同时锚定到 (200,200) 处的像素。