如何使用Python统计PGS格式字幕文件的条目数量
Python统计PGS格式字幕条目数的实现方法
PGS(Presentation Graphic Stream)是蓝光常见的图形字幕格式,其存储结构基于分段设计,每个独立的字幕显示条目对应一个演示合成段(PCS,Presentation Composition Segment),统计该类型段的数量即可直接得到字幕总条目数,全程不需要OCR、不需要转换为SRT格式、不需要解析字幕图像内容。
方法1:使用第三方库快速实现
- 第一步:安装轻量PGS解析库
pgsreader,无额外图像处理依赖pip install pgsreader - 第二步:调用代码统计
from pgsreader import PGSReader def count_pgs_entries(pgs_file_path: str) -> int: pgs = PGSReader(pgs_file_path) entry_count = 0 # 遍历所有字幕显示集,每个有效显示集对应1条字幕条目 for display_set in pgs.iter_displaysets(): if display_set.has_image: entry_count += 1 return entry_count if __name__ == "__main__": # PGS格式文件通常后缀为.sup,替换为你的文件路径即可 sup_file_path = "./example_subtitle.sup" total = count_pgs_entries(sup_file_path) print(f"字幕总条目数:{total}")
方法2:无第三方依赖的原生实现
如果不想安装额外库,可以直接解析PGS的二进制结构统计PCS段数量:
def count_pgs_entries_raw(pgs_file_path: str) -> int: # PGS段魔数、PCS段类型常量定义 PGS_MAGIC = b'PG' PCS_SEGMENT_TYPE = 0x16 entry_count = 0 with open(pgs_file_path, "rb") as f: while True: # 读取9字节段头信息:2字节魔数 + 1字节段类型 + 4字节时间戳 + 2字节段长度 header = f.read(9) if len(header) < 9: break # 校验是否为有效PGS段 if header[:2] == PGS_MAGIC: segment_type = header[2] # 统计PCS段数量 if segment_type == PCS_SEGMENT_TYPE: entry_count += 1 # 跳过当前段的内容部分,读取下一个段头 segment_length = int.from_bytes(header[7:9], byteorder="big") f.seek(segment_length, 1) else: # 匹配不到魔数则跳过1字节继续校验 f.seek(1, 1) return entry_count if __name__ == "__main__": sup_file_path = "./example_subtitle.sup" total = count_pgs_entries_raw(sup_file_path) print(f"字幕总条目数:{total}")
两种方法的处理速度都非常快,GB级别的PGS文件也可以在数秒内完成统计。
内容的提问来源于stack exchange,提问作者santos82h
相关产品推荐
相关产品推荐

