Board logo

标题: 如何分割一个字幕文件为两个文件 [打印本页]

作者: sinbao     时间: 2007-10-13 18:58    标题: 如何分割一个字幕文件为两个文件

因为我下载了一个电影,分为cd1和cd2,但是字幕文件只有一个File.srt.
为了我的cd2可以使用字幕,需要把cd2的字幕部分截取出来,再把时间对应的偏移一下.
所以需要把文件File.srt分成两个:File1.srt和File2.srt

例子如下,时间的部分我就选了30秒作为偏移了,没有精确到毫秒:
File.srt文件是这样的:
1
00:00:02,700 --> 00:00:04,700
WWW.CHDTV.NET

2
00:00:08,700 --> 00:00:12,700
-=影片压制:阿步@CHD联盟=-
-=字幕制作:特大碗牛肉面@CHD联盟=-

3
00:00:23,420 --> 00:00:26,116
(澳洲雪梨)

4
00:00:33,830 --> 00:00:35,388
(拜塞制药厂)

5
00:00:38,869 --> 00:00:42,828
狄米特,每个英雄的诞生

6
00:00:43,507 --> 00:00:46,408
都有一个必备的条件

7
00:00:48,011 --> 00:00:48,943
一个坏人

8
00:00:49,980 --> 00:00:54,474
为了我们的英雄贝雷明
分割成:File1.srt
1
00:00:02,700 --> 00:00:04,700
WWW.CHDTV.NET

2
00:00:08,700 --> 00:00:12,700
-=影片压制:阿步@CHD联盟=-
-=字幕制作:特大碗牛肉面@CHD联盟=-

3
00:00:23,420 --> 00:00:26,116
(澳洲雪梨)
和File2.srt
1
00:00:03,830 --> 00:00:05,388
(拜塞制药厂)

2
00:00:08,869 --> 00:00:12,828
狄米特,每个英雄的诞生

3
00:00:13,507 --> 00:00:16,408
都有一个必备的条件

4
00:00:18,011 --> 00:00:18,943
一个坏人

5
00:00:19,980 --> 00:00:24,474
为了我们的英雄贝雷明
[ Last edited by sinbao on 2007-10-13 at 07:04 PM ]
作者: lxmxn     时间: 2007-10-13 20:42

BEGIN{
#设置时间差,根据自己的情况设定
        times=30;

#设置生成文件名,根据自己的情况设定
        file1="file1.txt";file2="file2.txt";
       
#调用内部函数system删除已经存在的file1和file2;
        system("if exist " file1 " del " file1);system("if exist " file2 " del " file2);
}

#处理时间标签的行
function deal_with(fileline){
        split(fileline,myarray)
        return sprintf("%s %s %s",compute(myarray[1]),myarray[2],compute(myarray[3]));
}

#计算时间差并返回结果
function compute(lineTime){
        n=split(lineTime,timeArray,/[:,]/);
        timeArray[3]-=times;
        if(timeArray[3]<0){
                timeArray[2]-=1;
                if(timeArray[2]<0){timeArray[1]-=1;timeArray[2]+=60;}
                timeArray[3]+=60;
        }
        t=0
        return sprintf("%02s:%02s:%02s,%s",timeArray[++t],timeArray[++t],timeArray[++t],timeArray[++t]);
}

#主程序部分,对file.srt文件进行分析并处理
{
        if($0~/^[0-9]+$/){
                num+=1;
                if(num<4){
                        files=file1;
                }else{
                        $0=++new_num;
                        files=file2;
                }
        }

        if(num>3){
                if($1~/^[0-9][0-9]:[0-9][0-9]/){
                        print deal_with($0)>files;
                }else{print $0>files;}
        }else{print $0>files;}
}
将以上脚本保存为split_file.awk,然后在命令行执行:
gawk -f split_file.awk file.srt
即可。

需要用到外部工具Gawk.exe,在这里下载:
http://www.cn-dos.net/forum/viewthread.php?tid=31098&page=1#pid205571
作者: sinbao     时间: 2007-10-13 22:15
http://zhenlove.com.cn/cndos/fileup/files/gawk.rar
连接似乎失效了...
作者: zh159     时间: 2007-10-13 22:32
http://zhenlove.com.cn/cndos/

  Quote:
因上传木马病毒,该空间被冻结


作者: lxmxn     时间: 2007-10-13 22:54
提供一个公共的邮箱:
cn_dos_public@126.com
密码:chinados
里面有gawk.rar,请下载之后不要删除了.