字幕文件处理(1)

摘要

一个字幕文件一般包含两部分内容:时间索引和脚本内容。一般,常见的字幕文件格式有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;
        }
    }

转载请注明出处http://www.cnblogs.com/qixue/p/5498253.html

原文地址:https://www.cnblogs.com/qixue/p/5498253.html