|
|
说一下怎么写的这个吧。
首先合并字幕的功能。注意到Potplayer播放原盘时会自动选择一条mpls播放,据我观察基本上是选取了时间最长的一条mpls,但有时候也会选错。针对其中的一些问题我设计了结合时长、章节数、文件体积等因素综合判断的算法,以提高选取的正确率。并且Potplayer播放原盘的mpls时,播放进度条上是有章节点的。这些章节点肯定是由原盘某些文件读取出来的。为此我查阅了相关资料,得知章节信息是在原盘mpls文件中。具体参考https://github.com/lw/BluRay/wiki/PlayList。实际上,mpls给的信息并没有直接告诉某个章节点的时间,时间需要自行计算。计算方式如注释中所写: # in_out_time 是一个列表,列表的每一项是一个元组,按照播放对应的顺序
# 元组第一位为文件名,第二位是 in_time,第三位是 out_time
# 对应 m2ts 文件的播放时长为 (out_time - in_time) / 45000
# mark_info 是一个字典
# 字典的键 ref_to_play_item_id 对应 in_out_time 的索引
# 字典的值为由章节标记对应的时间戳 mark_timestamp 组成的列表
# 那么时间戳对应在 mpls 的播放时间为 (mark_timestamp - in_time) / 45000
# + (0 ~ ref_to_play_item_id 所有文件对应的播放时长之和) 。有了这些信息,就知道了mpls上每个章节点和对应的时间,但是还不够,还要确定哪些章节点是每集的开头。由in_out_time可知章节点对应的文件名,一般而言,每集的开头位于一个文件的起始位置,一个文件对应一集。然而并非总是如此,比如一些连体盘,某些集数的开头可能位于文件的中间;而某些肉酱盘一集可能对应多个文件。为了应对这些特殊情况,我在判断每集开头时会检查字幕的时间,一般而言每集的结束时间会比字幕最后一条对话的时间稍微长一点,这样一来判断的成功率就会高很多。但是,选取mpls和判断每集开头章节点的算法是有局限的,没办法能保证所有情况下都是正确的,所以我设计了这个GUI,特殊情况下可以依靠手动选择mpls/调整字幕顺序/手动选取字幕的章节点这些操作来纠正程序自动算法错误的情况。然后就是合并字幕,包括ass/ssa和srt字幕文件的合并,都是文本文件就不展开说了。
然后是mkv添加章节的功能。某些压制组比如Moozzi2/DBD-Raws/AI-Raws(24年12月之前)压制作品是不带章节信息的,还原章节信息的方式如一楼所说,就是从原盘的mpls文件中还原。首先要选择正确的mpls,然后要确定每集的起始点位于哪个时间点。有了压制的mkv文件,时间点偏移是很好确定的,就是之前mkv的时长之和。根据这些时间点偏移对mpls中的章节点做切割,就可以得到每集对应的章节信息。
动漫原盘remux,这个功能基于前面两个功能中的某些方法。步骤如下:1.选取正确的mpls 2.确定每集开头的章节点。如果有字幕文件,则根据字幕的结束时间判断,如果没有则根据每集大致为24分钟判断。 3.mkvtoolnix混流并按照章节点切割 4.为mkv重新添加章节(其实就是用到前一个功能) 5.抽取pcm压缩成flac并重新混流,如果有字幕也一并混流 6.搜索mpls,如果有mark数大于1的mpls则将此mpls混流到SPs文件夹 7.剩下的m2ts,如果时长大于30s则混流到SPs文件夹 8.将SPs文件夹中的mkv文件的pcm音轨替换成flac
美剧原盘remux,这个基于另外一个脚本就不说了,反正就是各种抽取与转换。
|
|
|
|
|
|