wyzdwdz
发表于 2024-10-3 21:29:16
本帖最后由 wyzdwdz 于 2024-10-3 21:37 编辑
chaos32767 发表于 2024-10-3 20:28
災情來自這裡:
【ListAssFonts: 小工具,分析字幕使用的字型 (2023/06/13 更新)】
https://bbs.acgrip.com ...
唉,搞了这么久,越发觉得字幕的字体子集化就是一个伪需求,因为把字体嵌入 ass 字幕或者是嵌入视频文件就是为了保证字幕显示的跨平台一致性。但是 ass 又是一个可以自由编辑的文本格式,可编辑性与跨平台显示一致性实际上是相悖的,就好比 word 文档在不同操作系统或者不同软件打开是很难保证显示的内容是完全相同的。又或者说 ass 字幕一开始诞生的目的就不是为了追求所谓的在不同设备上显示完全相同的内容,所以 pgs 字幕真的是目前的唯一解,要不然我们就得开发一个全新的类 pdf 格式的矢量字幕。
chaos32767
发表于 2024-10-3 23:19:10
本帖最后由 chaos32767 于 2024-10-3 23:35 编辑
看片就應該開開心心簡簡單單的。
播放器打開,影片丟進去,然後……幹又是缺字又是亂碼是哪一家壓的這麼爛以後不抓他們家的東西了啦!!!
還是回頭去看動畫瘋那個爛爛的硬崁字幕。
唉。
另外多講兩句。
【超级字体整合包 XZ】,不精準統計,一萬八千個字型檔。
然後各家字型公司還在不斷的生出新的字型。
然後字幕組不斷換更新更炫的字型。
然後就是字幕動不動就缺字。
然後就是問題出不完。
大家爆炸吧!
tonyhsie
发表于 2024-10-4 06:18:53
wyzdwdz 发表于 2024-10-3 21:00
字体改名后是无法还原的,因为这个改名是不可逆的。本工具生成的随机名会出现多对一的情况,即几个不同名 ...
看完還是沒有理解,為什麼會無法還原
如你所言,Arial 有 regular、bold、italic、bold italic 四種子型
四種子型子集化後,是同一個亂數名字,還是四個亂數名字?
子集化的時候,會更改 .ass 檔案裡相關字型的粗體或斜體設定嗎?
請問改名後無法還原的關鍵因素是什麼?
謝謝
wyzdwdz
发表于 2024-10-4 19:10:45
本帖最后由 wyzdwdz 于 2024-10-4 19:33 编辑
tonyhsie 发表于 2024-10-4 06:18
看完還是沒有理解,為什麼會無法還原
这四个子集化后有可能会改为同一个乱序名字,粗体和斜体的设置保持不变,只更改字体名。
至于为什么无法还原,我举一个例子,假设我有一个 ass 文件是这样的
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: One,Arial,40,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,0,1,0,0,100,100,0,0,1,2,1,2,30,30,10,1
Style: Two,Arial Italic,40,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,0,0,0,0,100,100,0,0,1,2,1,2,30,30,10,1
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:10.00,One,,0,0,0,,This is Style One, it is Arial Italic!!
Dialogue: 0,0:00:10.00,0:00:20.00,Two,,0,0,0,,This is Style Two, it is also Arial Italic!!
子集化并改名后是这样的
Arial ---- GHTXBYBR
Arial Italic ---- GHTXBYBR
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: One,GHTXBYBR,40,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,0,1,0,0,100,100,0,0,1,2,1,2,30,30,10,1
Style: Two,GHTXBYBR,40,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,&H00FFFFFF,0,0,0,0,100,100,0,0,1,2,1,2,30,30,10,1
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:10.00,One,,0,0,0,,This is Style One, it is Arial Italic!!
Dialogue: 0,0:00:10.00,0:00:20.00,Two,,0,0,0,,This is Style Two, it is also Arial Italic!!
这个例子比较特殊,仔细看,原始 ass 文件 中样式 One 和 样式 Two 尽管它们的 fontname 不同,一个是 Arial,一个是 Arial Italic。但是由于样式 One 的 Italic 值为 1,所以它实际上使用的还是 Arial Italic 这个字体。因此,对于这个文件,我们只需要对 Arial Italic 这个字体做子集化,并修改它的名字。但是还原的时候就出了问题,如果你把所有的 GHTXBYBR 都替换成 Arial,那么显然样式 Two 会出错,因为它应该是 Arial Italic。
当然如果一定要还原原始信息,目前 中提供的信息是不够的,需要详细记录字幕中每一处被修改的 fontname 的原始字体。
tonyhsie
发表于 2024-10-4 23:27:13
wyzdwdz 发表于 2024-10-4 19:10
这四个子集化后有可能会改为同一个乱序名字,粗体和斜体的设置保持不变,只更改字体名。
至于为什么无法 ...
粗體/斜體其實有兩種實現方式
一種是 "Arial Italic",這種字型名稱跟 "Arial" 完全不同的斜體
一種是 "Arial" 加上 {\i1} 或在 style 行設定 italic 值為 -1
如果是第一種方式,也就是你舉的例子的話
子集化後其實不應該跟 Arial 使用相同的名字
也就是 "Arial" 子集化後是一個名字,"Arial Italic" 子集化後是完全不同的另一個名字
至於第二種方式的話,由於並沒有使用兩種不同 fontname,所以子集化後也只會有一種名字
而這兩種方式,子集化後應該還是可以還原回原本的字幕才是
wyzdwdz
发表于 2024-10-5 02:50:52
本帖最后由 wyzdwdz 于 2024-10-5 02:54 编辑
tonyhsie 发表于 2024-10-4 23:27
粗體/斜體其實有兩種實現方式
一種是 "Arial Italic",這種字型名稱跟 "Arial" 完全不同的斜體
你说的这两种实现方式在播放器中选择的其实都是 Arial Italic.ttf 这个字体,表现出来的结果没有任何区别。样式 One 的 fontname 是 Arial,但是由于它的 Italic 为 1(这里 1 或者 -1 都可以),即你说的第二种方式,那么播放器在显示样式 One 时就会直接调用 Arial Italic.ttf 来实现这个斜体效果(只用 Arial.ttf 并不能实现斜体效果)。
操作系统或者播放器匹配用来显示的字体 (font match) 时一般使用一套算法,我这里参考的是 libass 库中内置的字体匹配算法,当你告诉播放器我需要一个名字为 Arial 的斜体字体时,它会把这一需求转换为 Arial(400, 100) 这一形式,其中 Arial 为 fontname,400 表示字体的粗细度(默认为400),100 表示字体的倾斜度(默认为0)。算法会首先匹配 family name,它会挑出所有 family name 为 Arial 的字体,然后根据一套打分规则计算其中每一个字体与目标字体的距离,最后选取距离最小的作为显示字体。那么在这套规则下, Arial(400, 100) 与 Arial Italic(400, 0) 对应的都是 Arial Italic.ttf。
那么既然播放器只使用了 Arial Italic.ttf 这一个字体,我们自然只需要对它一个进行子集化,同样的也只改了这一个字体的名字(注意这里更改的是字体的 family name),也就是 GHTXBYBR,由于子集化后只有这一个新字体,那么自然 Arial 与 Arial Italic 都得改为同一个新名字。
tonyhsie
发表于 2024-10-5 06:07:36
wyzdwdz 发表于 2024-10-5 02:50
你说的这两种实现方式在播放器中选择的其实都是 Arial Italic.ttf 这个字体,表现出来的结果没有任何区别 ...
我想這樣的作法,是有點混淆了前端跟後端的區別
前端:ass 檔案實際使用的 fontname
後端:ass 檔案實際會調用到的字型檔案
fontname 為 Arial 或 Arial Italic,顯然是兩種不同的 fontname
雖然對這兩種 fontname 來說,後端可能都是調用同一個 ariali.ttf 沒錯
但不見得前端就一定要統一成一個名字
會無法還原回原本的字幕,關鍵也是在此
如果前端是分成兩個名字分別處理,以後也自然能還原回本名
但如果在前端就把這兩個不同 fontname 改名成同一名稱,之後當然就無法還原了