.ASS字幕坐标定位异常:1080×1920视频中位置不符求解
ASS字幕坐标定位问题:1080×1920视频中坐标不符的解决方法
问题描述
制作1080×1920视频的ASS格式字幕时,从PyQT(画布尺寸1080×1920)获取的字幕坐标(如(275,876))写入ASS文件后,字幕位置与预期不符。即使已在ASS中设置PlayResX=1080和PlayResY=1920,使用{\pos(x,y)}标签定位仍出现偏移,例如设置(200,200)时位置远偏离预期。
当前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 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}
补充:预期效果为字幕位于画面左侧偏上区域,实际效果中字幕位置明显偏离该区域。
ASS字幕定位机制解析
- 坐标系统:ASS的坐标原点为画面左上角(0,0),X轴向右递增,Y轴向下递增,与多数UI框架一致。
- PlayResX/Y作用:定义脚本的虚拟分辨率,当与实际视频分辨率一致时,脚本坐标直接对应视频像素坐标;若不一致,渲染器(如ffmpeg)会自动等比例映射。
- {\pos(x,y)}标签:默认将文本块的左上角对齐到(x,y),但该参考点由Style中的
Alignment参数决定。 - Alignment参数:决定文本相对于
{\pos(x,y)}坐标的对齐方式,常用值:- 1:左上角对齐(默认)
- 2:水平居中对齐
- 5:水平+垂直居中对齐
- 9:右下角对齐
问题根源与解决方案
问题根源
- Style缺少Alignment参数:你的ASS Style格式未包含
Alignment字段,默认使用左上角对齐(Alignment=1),但PyQT获取的是文本中心坐标,导致位置偏移。 - 标签写法错误:
{\pos(...)}与样式标签分开写,可能导致pos未正确应用到整个文本块。
具体修正步骤
1. 完善Style格式与定义
修改[V4+ Styles]部分,添加Alignment字段,并设置对应对齐方式(若PyQT获取的是中心坐标,设置为5):
[V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BorderStyle, Alignment, Encoding Style: Default, Segoe UI,9,&H00FFFFFF,&HFFFF00,&H00FFFFFF,0,5,0 Style: Background, Segoe UI,9,&H00FFFFFF,&H000000FF,&H00000000,3,5,0
2. 合并Dialogue标签块
将{\pos}与样式标签合并,确保定位效果覆盖整个文本:
[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}
3. 验证坐标映射
若PyQT获取的是文本左上角坐标,将Alignment设为1即可;若为中心坐标则设为5,此时{\pos(x,y)}会直接将文本中心对齐到该坐标点。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

