解决Safari中HLS字幕不同步:计算WebVtt的MPEGTS值方法
HLS WebVtt 对应MPEGTS时间戳计算方法
核心基准
MPEGTS时间戳采用90kHz时间基准,即1个MPEGTS单位 = 1/90000秒,所有计算都基于这个基准。
直接计算(基于WebVTT字幕绝对时间)
如果WebVTT字幕时间是相对于整个视频的绝对起始点,按以下步骤计算:
- 转换WebVTT时间为总秒数:
WebVTT时间格式为HH:MM:SS.mmm,将其转换为以秒为单位的浮点数。
示例:00:02:15.300→ 2*60 + 15 + 0.3 = 135.3秒 - 计算MPEGTS值:
将总秒数乘以90000,取整数结果(MPEGTS时间戳为整数)。
示例:135.3 * 90000 = 12177000 → 这就是对应MPEGTS值
基于视频片段起始PTS的精准计算
如果字幕和HLS视频片段绑定,需结合视频片段的起始PTS(从视频流提取的MPEGTS时间戳)计算:
- 获取视频片段的起始PTS:
可通过工具(如ffmpeg)从TS流中提取,比如执行命令ffprobe -show_packets -select_streams v:0 input.ts查看 - 计算字幕相对于片段的偏移秒数:
比如字幕在视频片段开始后3.5秒出现,偏移秒数即为3.5 - 计算最终MPEGTS值:
视频起始PTS + (偏移秒数 * 90000)
示例:视频起始PTS为5400000,偏移3.5秒 → 5400000 + (3.5*90000) = 5715000
关键注意事项
- 确保WebVTT时间精度与视频流一致,毫秒级误差都可能导致Safari中字幕不同步
- X-TIMESTAMP-MAP格式需严格符合HLS规范:
#EXT-X-TIMESTAMP-MAP=MPEGTS:<计算值>,LOCAL:<对应WebVTT时间> - 分段字幕需为每个字幕段单独计算对应视频分段的MPEGTS值,不能全局复用一个映射
内容的提问来源于stack exchange,提问作者Mangaleswaran Selvam
相关产品推荐
相关产品推荐

