摘要
一个字幕文件一般包含两部分内容:时间索引和脚本内容。一般,常见的字幕文件格式有WebVTT, SRT和TTML。 编辑字幕文件就是对每一段字幕的时间索引或脚本内容进行编辑。也包括对字幕文件的格式进行转换,参考字幕文件处理(2) - 字幕文件格式转化。
拿WebVTT来说,它支持如下两种格式的时间索引:
l mm:ss.ttt
l hh:mm:ss.ttt
而对于SRT文件格式,它的时间索引可能是这个样子的:
l hh:mm:ss,ttt
编辑时间索引时,如果将时间格式转化为整数格式,然后对整数进行加减操作(这里的整数应该是毫秒),相比于直接对时间进行加减操作要容易得多。 本文将介绍一个实现时间索引格式与整数格式相互转化的示例代码。
在示例中, 用于匹配时间索引的正则表达如下:
"([0-9]+:)?([0-9]+):([0-9]+)([\.|,][0-9]+)? --> ([0-9]+:)?([0-9]+):([0-9]+)([\.|,][0-9]+)?"
它匹配的时间格式如下:
l hh:mm:ss
l hh:mm:ss.ttt
l hh:mm:ss,ttt
l mm:ss
l mm:ss.ttt
l mm:ss,ttt
示例代码:
class TimeFormat { /// // type = t1 (01:11:12.001) // type = t2 (01:11:12,001) public static string ToHHMMSS(double value, string type) { int hh = (int)value / (60 * 60 * 1000); double remain = value % (60 * 60 * 1000); int mm = (int)remain / (60 * 1000); remain = remain % (60 * 1000); int ss = (int)remain / (1000); remain = remain % (1000); double mm2 = remain; if (type == "t1") return string.Format("{0:00}:{1:00}:{2:00}.{3:000}", hh, mm, ss, mm2); else if (type == "t2") { return string.Format("{0:00}:{1:00}:{2:00},{3:000}", hh, mm, ss, mm2); } else { return string.Format("{0:00}:{1:00}:{2:00}.{3:000}", hh, mm, ss, mm2); } } /// <summary> /// Support format /// 00:00:05.530 /// 00:00:05,530 /// 00:05.530 /// 00:05,530 /// 00:00:05 /// </summary> /// <param name="value"></param> /// <returns></returns> public static double ToDouble(string value) { double accumateValue = 0; string[] parts = value.Split(new char[] { \'.\', \',\' }); string[] values = parts[0].Split(new char[] { \':\' }); if (values.Length == 3) { for (int i = 0; i < values.Length; i++) { if (i == 0) { accumateValue += double.Parse(values[i]) * 60 * 60 * 1000; } else if (i == 1) { accumateValue += double.Parse(values[i]) * 60 * 1000; } else if (i == 2) { accumateValue += double.Parse(values[i]) * 1000; } } } else if (values.Length == 2) { for (int i = 0; i < values.Length; i++) { if (i == 0) { accumateValue += double.Parse(values[i]) * 60 * 1000; } else if (i == 1) { accumateValue += double.Parse(values[i]) * 1000; } } } if (parts.Length == 2) { accumateValue += double.Parse(parts[1]); } return accumateValue; } }