字幕文件处理(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;
        }
    }
时间: 2024-10-12 22:42:45

字幕文件处理(1) - 时间格式与整数格式互转的相关文章

ass translation python(ass字幕文件半自动平移时间轴py脚本)

1 # -*- coding: UTF-8 -*- 2 3 ''' 4 只适用于下面这种形式的ass文件 5 [Events] 6 Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 7 Dialogue: 0,0:1:30.19,0:1:32.89,Default,,0000,0000,0000,,{\t(1308,2700,\1c&H000000&\3c&H000000&

盒子外挂字幕文件和音轨文件的测试结果

设备: Q5 四代; DLNA手机让NAS推送视频给盒子播放 注意:DLNA推送的时候必须是内封字幕 或者是 硬字幕 外挂字幕都不支持 这个是目前DLNA协议的硬伤 外挂字幕:   Q5自带播放器: (不支持.sup外挂字幕文件) 蓝光原盘有两种,一种是iso格式,另一种是BDMV目录格式.海美迪Q5对于这两种蓝光原盘,都支持外挂字幕. 对于ISO格式,把外挂字幕与ISO文件放在一起,文件的基本名相同,就可以了,例如:S-e-x.and.Zen.2011.HK.3D.BluRay.1080p.D

1006. 换个格式输出整数

1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个“百”.3个“十”.以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一

PAT (Basic Level) Practise 1006. 换个格式输出整数

1006. 换个格式输出整数 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个“百”.3个“十”.以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定

Linux date命令-显示和设置系统日期与时间 压缩包以YYMMDD格式命令

date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]以给定的格式显示当前时间,或是设置系统日期. -d,--date=字符串        显示指定字符串所描述的时间,而非当前时间  -f,--file=日期文件        类似--date,从日期文件中按行读入时间描述  -r, --reference=文件        显示文件指定文件的最后修改时间  -R, --rf

PAT 乙级 水题1006. 换个格式输出整数 (15)

1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cin>>n; 7 int g=0,s=0,b=0; 8 9 10 for(int i=0;i<10;i++){ 11 for(int j=0;j<10;j++){ 12 for(int k=0;k<10;k++){ 13 if(k==n){ 14 g=k; 15 break; 16 } 17 else if(j*10+k

2018-3-14 12周3次课 Nginx访问日志、日志分割、日志不记录静态文件和过期时间

12.10 Nginx访问日志 ·日志格式: [[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf 搜索log_format (虽然红框中有三行,但实际上时一行配置,以分号为结尾) combined_realip 定义日志格式名字,此处定义成什么,那么后面引用时就要写成什么 公网ip(出口ip) ·除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加 access_log /tmp/1.log co

python 修改文件的创建时间、修改时间、访问时间

目录 python 修改文件创建.修改.访问时间 方案一 方案二(无法修改文件创建时间) python 修改文件创建.修改.访问时间 突如其来想知道一下 python 如何修改文件的属性(创建.修改.访问时间),于是就去网上搜集了可行方案,也就有了这篇博客 方案一 参考博客:python修改任意文件的创建时间.修改时间.访问时间 from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle from win32fi

Notepad++ 使用Python 插件批量 转换文本文件(字幕文件) 为 UTF8

有时候从网上下载了中英文的字幕文件,字符编码是ANSI的,需要转换为UTF-8的编码格式. 或者其他的文本文件需要转换为UTF8格式.可以实现批量转换. 在Notepad++安装Python Script 插件 打开插件管理器 在Search搜索框中输入:Python Script  , 然后选择插件,再点击Install 安装. 提示重启安装,选择 Y 是 弹出对话框,下载安装插件 Notepad++ 重启后,按下图操作 输入以下代码然后保存. import os; import sys; p