• 字幕文件处理(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

  • 相关阅读:
    git命令参考
    Raft 简介
    关于 K8S 的几个问题
    Ubuntu中用普通方法无法添加自启动
    so编译 链接和加载
    GDB调试命令详解
    MinGW中的头文件路径
    GDB使用详解
    dlopen、dlsym和dlclose的使用
    Windows下配置VSCode使用mingww64的gcc、g++编译器和GDB调试器
  • 原文地址:https://www.cnblogs.com/qixue/p/5498253.html
Copyright © 2020-2023  润新知