与文件格式.ASS配合

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

我正在抓取我想要用于文件格式 .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}

  • 编辑:我已经添加了 playresx 和 y,但文本仍然不在其应有的位置。为了添加更多上下文,我在 PyQT 中有一个场景,它使用坐标系统在视频上放置文本,对于该文本,它表示它位于 275 的 x 轴和 876 的 y 轴。当我将这些坐标用于.ASS 文本它不显示相同的位置。还有视频和文本所在的场景,它是 1920 年的 1080 年,这些图像显示了我想要的和我得到的:

What I'm trying to achieve

what I'm getting

ffmpeg subtitle ffmpeg-python video-subtitles pyffmpeg
1个回答
0
投票

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),可能的值为:

\an override tag

这些对齐数字 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) 处的像素。

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