最近迷上了一部美剧,权力的游戏 ,Game of Thrones.追到了第三季。可惜下到的版本都是中文字幕或者中英字幕。作为一个自以为英语还不错的人,怎么能看中文字幕呢,中英字幕也是不行的。 不看纯英文的字幕,逼格真是太低了。
可惜,能下载的带字幕的版本都是中文字幕或者中英字幕。没办法,只有下了一个不带字幕的版本,然后自己再去找纯英文的字幕。
好不容易把电视剧视频文件和纯英文字幕凑齐了,正准备在纯英文的语境中欣赏呢,发生了一件让我吐血的意外。字幕的时间和视频的时间是不匹配的。暴风影音的微调字幕的功能,最多也不能超过一分钟。然而,这个字幕和视频的时间差足有两分多钟,大概是字幕对应的那个视频裁掉了片头吧。照着字幕的名字去搜视频,也没有搜到。看来只能修改字幕中语句的时间了。

时间一旦错了,每句对话的文本的时间都要修改,如果手动去修改的话,还不把人给累死,把字幕改好了,也没有欣赏电影的欲望了。这种重复的程序化工作,不就是应该用计算机编程来解决吗?看来我学了这么长时间的c语言,现在可以派上用场了。有点小兴奋。

大概思路是,根据视频中的某个语句和时间,在字幕文件中找出对应的语句和时间,两个时间的差值就是声音与字幕的时间差,记录这个时间差。逐一读取原字幕文件中的字符,如果是非时间的字符,将其原封不动的复制写入另一个文件中;如果是显示时间的字符,则对其进行必要的修改,加上时间差,将修改后的时间字符串写入新字幕文件中。

因为我用的标准c,仅支持ANSI字符集,又是纯英文字符,ANSI编码也足够了。字幕文件拷贝到c盘下,我假定你是一定有c盘的,用记事本打开,另存为ANSI编码格式,不要理会警告。

这样的话,字幕文件里的所有字符c语言都可以处理了。

就可以用fopen()函数打开和创建。

运行我的代码后,在输入框里根据提示输入文件名。我的代码会自动拼接上路径名和后缀名,在c语言中,这才是完整的文件名。

这里面的关键问题是,要修改时间,那么如何标定时间字符串?仔细观察字幕文件。

1
00:02:13,110 --> 00:02:15,879
<i>Fall back!</i>

2
00:03:02,662 --> 00:03:04,463
Brother?

3
00:04:25,646 --> 00:04:28,314
Did you send the ravens?

很容易发现,形如xx:xx:xx的时间字符串,最显著的特征就是冒号。于是,打开字幕文件后,就用':'来标定时间。用习语while( (ch=fgetc(fp)) != EOF )逐一读字符,读到':'之后,停下来,进行修正时间的操作;如果读的不是':',即与时间无关的字符,则用fputc(ch,fp1)将字符原封不动写入新文件中,fp1是写入文件的指针。

第一次读到':’之后,代表读的是分钟之前的':',那么将读文件的内位指针(这是我自己起的名字,代表文件信息结构体内指示当前读指针位置的值)往后退3个字符长度,退到小时之前,即整个时间字符串之前,用文件扫描格式函数fsanf(fp,"%2d:%2d:%2d",&th,&tm,&ts)对整个时间字符串xx:xx:xx进行扫描,得到时间后,进行修正,再用文件打印格式函数fprintf向写文件中打印整个时间字符串。因此,也要将写文件的内位指针往后退2个字符长度,退到小时之前。

为什么读文件指针退后3个字符长度,而写文件指针退后2个字符指针,它们退后的程度不一样呢?

因为,fgetc()除了读了表征小时的2个字符外还多读入了一个':',而fputc()只写下了表征小时数的两个字符。

读文件指针退到小时之前以后,用文件扫描格式函数fsanf(fp,"%2d:%2d:%2d",&th,&tm,&ts)读出原字幕中的小时、分钟和秒,把这个时间换算成秒,加上时间的差值(也是用秒表示的)。将修正后的时间换算成xx:xx:xx的格式,向新文件中写入即可。

完整代码如下:

#include "stdio.h"
#include "string.h"main()
{
char originalfullname[1024] = "c:/";//at first,the fullname contains the path;
char changedfullname[1024] = "c:/Changed_";// the name of the new established subtitle file,added prefix;
char inputname[1024] ;//the sheer subtitle file name;
//following is the process that constructs the names of both original and changed;
//just plain concatenation works;
printf("please input the subtitle file name \n");
scanf("%s",inputname);
strcat(originalfullname,inputname);
strcat(changedfullname,inputname);
char *suffix = ".srt";
strcat(originalfullname,suffix);
strcat(changedfullname,suffix);
//
//int vh,vm,vs;//beginning time of sounding of the special subtitle in video,hour,minute,second,respectively;
printf("input the beginning time of the subtitle in video\n");
printf("in format xx:xx:xx\n");
scanf("%2d:%2d:%2d",&vh,&vm,&vs);
fflush(stdin);int fh,fm,fs;//beginning of the special subtitle's time in subtitle file,hour,minute,second,respectively;
printf("input the beginning time of the subtitle in subtitle file\n");
printf("in format xx:xx:xx\n");
scanf("%2d:%2d:%2d",&fh,&fm,&fs);int dt;//difference of time,from subtitle file to video;
dt = ( vh*3600+vm*60+vs) - (fh*3600 + fm*60 + fs);
printf("the time difference is %d\n",dt);FILE *fp,*fp1;//two file pointers,one is for original subtitle file,while the other for changed subtitle file;
fp = NULL;
fp1 = NULL;fp = fopen(originalfullname,"r");
fp1 = fopen(changedfullname,"w+");//if no such a file exists,a new file of same name established;
if (!fp || !fp1)//if fp or fp1 is a not effective file pointer,return,ending this program;{printf("file opening  or file establishing failed!\n ");return;}char ch;
int th,tm,ts,time;//time_hour,time_minute,time_second,and time in seconds;
while(   ( ch = fgetc(fp) ) != EOF   )//the idiom,retrieving every character of the file;{if(ch == ':'){fseek(fp,-3L,SEEK_CUR);fseek(fp1,-2L,SEEK_CUR);fscanf(fp,"%2d:%2d:%2d",&th,&tm,&ts);time = th*3600 + tm*60 + ts;time += dt;th = time/3600;tm = (time%3600)/60;ts = time%60;//following,print the time format string.hour ,minute and second apart printed .//indeed,they have a entire printing effect as a whole;fprintf(fp1,th<=9?"0%d":"%d",th);fputc(':',fp1);fprintf(fp1,tm<=9?"0%d":"%d",tm);fputc(':',fp1);fprintf(fp1,ts<=9?"0%d":"%d",ts);continue;}fputc(ch,fp1);}
fclose(fp);
}

在找字幕和视频的时间差的时候,先打开字幕文件看一下,看前面几个对话,留下个印象,顺手将字幕文件保存为ANSI编码格式。我听力比较菜,如果之前不留个印象的话,在视频中,光靠听,我是听不清楚一句英语的。然后在视频开头找能听得懂的语句,记录下时间,再到字幕文件中找到对应语句,记录下时间。运行代码的时候,再输入文件名之后,接着输入两个时间,就将字幕中所有语句的时间修改好了。在c盘下找到以Changed开头下划线加上原来文件名的字幕文件。

用暴风影音打开视频,载入修改后的字幕文件,享受纯英语语境下的大片吧。如果有一点点的不匹配,用暴风影音的提前和延迟字幕的功能就好。

当night watch的队长质问john snow胖胖的伙伴tarly:"Did you send the ravens",随着声音响起,匹配的字幕适时出现在视频下方,还是蛮有成就感的!

这虽然只是c语言编程的一个小小的例子。但是它揭示了计算机科学的几个普遍原理:1.一切科学和技术都是为了让人过得更好的,拥有更好的人生体验。2.计算机和编程解决问题的核心,是对问题本身的认识和理解,比如,在这个小实例中,认识到':'是标示时间字符串的关键,后面就势如破竹。同理,在大的计算机解决问题实践中,要花更多的时间去深入理解问题的本身,是关键,也是加力。3.算法的重要性,在这个例子中,我找到冒号以后,将文件指针退到整个时间字符串之前,对整个时间字符串进行扫描,不仅使形式更完备,而且这样就将文件指针推进到整个时间字符串之后,就屏蔽了秒之前那个冒号。否则,还需对两个冒号进行鉴别,哪个是分之前的,哪个是秒之前的,如果读到的是秒之前的冒号怎么办,这样就会复杂很多。
在程序对文件处理的时候,还是需要显示一些提示,这样以降低等待的枯燥。我选择将修改时间的处数打印出来,再加上一些对话语句。

修改了1324处的时间,如果手动修改,真不知道修改到什么时候。计算机科学真是太强大了,我爱死你了,解救人类于重复繁琐枯燥劳动的女神学科!
最终的完整代码如下:

#include "stdio.h"
#include "string.h"main()
{
char originalfullname[1024] = "c:/";//at first,the fullname contains the path;
char changedfullname[1024] = "c:/Changed_";// the name of the new established subtitle file,added prefix;
char inputname[1024] ;//the sheer subtitle file name;
//following is the process that constructs the names of both original and changed;
//just plain concatenation works;
printf("please input the subtitle file name \n");
scanf("%s",inputname);
strcat(originalfullname,inputname);
strcat(changedfullname,inputname);
char *suffix = ".srt";
strcat(originalfullname,suffix);
strcat(changedfullname,suffix);
//
//int vh,vm,vs;//beginning  time of sounding of the special subtitle in video,hour,minute,second,respectively;
printf("input the beginning time of the statement in video\n");
printf("in format xx:xx:xx\n");
scanf("%2d:%2d:%2d",&vh,&vm,&vs);
fflush(stdin);int fh,fm,fs;//the beginning of  subtitle time in subtitle file,hour,minute,second,respectively;
printf("input the beginning time of the subtitle in subtitle file\n");
printf("in format xx:xx:xx\n");
scanf("%2d:%2d:%2d",&fh,&fm,&fs);int dt;//difference of time,from subtitle file to video;
dt = ( vh*3600+vm*60+vs) - (fh*3600 + fm*60 + fs);
printf("the time difference is %d\n",dt);FILE *fp,*fp1;//two file pointers,one is for original subtitle file,while the other for modified subtitle file,//which should be newly established.
fp = NULL;
fp1 = NULL;
fp = fopen(originalfullname,"r");
fp1 = fopen(changedfullname,"w+");//if no such a file exists,a new file of same name established;
if (!fp || !fp1)//if fp or fp1 is an ineffective file pointer,return,ending this program;{printf("file opening  or file establishing failed!\n ");return;}char ch;
int th,tm,ts,time;//time_hour,time_minute,time_second,and time in seconds;
int i;
i=0;
while(   ( ch = fgetc(fp) ) != EOF   )//the idiom,retrieving every character of the file;{if(ch == ':'){fseek(fp,-3L,SEEK_CUR);//backward ,in front of the time string in read file;fseek(fp1,-2L,SEEK_CUR);//backward,prepared for writing time anew entirely;fscanf(fp,"%2d:%2d:%2d",&th,&tm,&ts);//get the hour ,minute and second of the original timetime = th*3600 + tm*60 + ts;time += dt;//renew the time ,by plus the  difference;//convert the time, for the format , hour:minute:second;th = time/3600;tm = (time%3600)/60;ts = time%60;//following,print the time format string.hour ,minute and second apart printed .//indeed,they have a entire printing effect as a whole;fprintf(fp1,th<=9?"0%d":"%d",th);//if the value less than 10,in form : 0value,for example,7 is 07;fputc(':',fp1);fprintf(fp1,tm<=9?"0%d":"%d",tm);fputc(':',fp1);fprintf(fp1,ts<=9?"0%d":"%d",ts);i += 1;printf("your little program has changed %d ",i);printf(i>1?"places":"place");printf(" of time\n");continue;}fputc(ch,fp1);}
fclose(fp);
fclose(fp1);
printf("enjoy your films!my lady or sir!\n");
getchar();
}   

为了方便没有装c语言编辑器的同学,我把我编译过的应用程序changesubtime.exe上传到我的新浪微盘了。下载地址 下载地址

下载之后,根据以下步骤就可以批量修改字幕时间了。

1.将字幕文件拷到c盘(不要放在任何文件夹里面)。

2.运行changesubtime.exe应用程序,根据提示输入文件名。

3.打开电影,找到一条字幕,记下它的开始时间。在程序中输入,注意格式是两个数字间隔冒号的。

4.打开字幕文件,记事本方式,找到那条字幕,记录字幕的开始时间。保存,关闭记事本。在程序中输入刚才记录的时间。

5.在c盘中找到修改过的字幕文件,以Changed开头,下划线后带的是原来的文件名。将它和电影关联起来。

享受纯英文环境下的视觉大片吧。

批量修改字幕文件中的时间,c语言实现相关推荐

  1. 使用Python批量修改PPTX文件中文本框格式

    问题描述:最近正在整理Python教材的配套PPT,原来的PPT是4:3的,考虑到现在很多屏幕都是宽屏的,于是打算重新整理一下.对于正常的幻灯片,直接在"页面设置"中修改一下就可以 ...

  2. 使用python批量修改txt文件中的信息

    使用python批量修改txt文件 在更改深度学习很多标签文件的时候,我们有时候需要自己修改txt文件里的路径,这时候如果写一个python程序,就会比较容易: import os import ra ...

  3. Python批量设置pptx文件中文本框边框与填充样式(含20分钟视频讲解)

    近期会议: 10月30-11月1日 全国高校Python课程高级研修班(苏州) 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清 ...

  4. html让文本框左剧中对齐_Python批量设置pptx文件中文本框边框与填充样式(含20分钟视频讲解)...

    近期会议:10月30-11月1日 全国高校Python课程高级研修班(苏州)推荐图书:<Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学 ...

  5. Python使用三种方法批量修改记事本文件编码格式

    应用背景:近期计划写一个贝叶斯算法邮件分类的教学案例,苦于没有足够的训练集,就让同学们帮忙每人从自己的邮箱中找几封垃圾邮件把内容复制下来放到记事本文件中发给我,但是忘了提前统一编码格式要求,所以收到的 ...

  6. 批量提取 srt 字幕文件中的文字

    概要:相信经常与视频处理打交道的小伙伴对字幕文件一定不陌生.字幕文件一般来说会包含字幕序号.播放时间轴与具体的字幕内容,经常用于在视频播放的时候在对应的时间显示相应的字幕内容.字幕文件通常会有多种类型 ...

  7. 批量替换一个文件中的文件名,例如将文件夹中s**_abnormal.jpg文件修改为s**_abnor.jpg

    文章涉及到StringAbout::开头的函数具体实现参考:string与Cstring字符串类型转换和其他操作总结 CProcessFile::开头的函数实现参考:文件读写操作工具类CProcess ...

  8. 如何批量修改word文件名称?

    如何批量修改word文件名称?word文件可以说是工作中最常见也使用最多的文件形式,我相信每个人的电脑中word文件是最多的,文件多了就需要进行整理,整理文件的最重要一点就是给文件进行重命名,让他们更 ...

  9. 批量删除java注释_怎样批量去掉java文件中的注释

    展开全部 批量去掉Java文件中的注释,可以e69da5e887aa3231313335323631343130323136353331333337396231使用正则表达式进行批量操作,代码如下:i ...

  10. python批量提取pdf的数据_Python批量提取PDF文件中文本的脚本

    本文实例为大家分享了Python批量提取PDF文件中文本的具体代码,供大家参考,具体内容如下 首先需要执行命令pip install pdfminer3k来安装处理PDF文件的扩展库. import ...

最新文章

  1. DSP编程技巧---C/C++与汇编语言的交互之-使用编译器的内联函数
  2. sql join 与where的区别
  3. 常见工具:dp与px互转,屏幕宽度与高度获取
  4. java tm无响应_Java(TM) Platform SE binary 未响应 是怎么个情况?
  5. 聊一聊大火的对比学习
  6. 移动端实现标题文字的截断
  7. 如何关闭苹果Mac上的触控板功能防止误触?
  8. php流水系统,php流水账txt数据库版
  9. cad户型图练习_我的房子我做主 篇一:技多不压身—业内人士手把手教你学会用CAD绘制户型图...
  10. mysql update 子表,mysql update 子查询锁表问题
  11. c#控制台模拟dos_超好用的C#控制台应用模板
  12. 230个形容人性格的英语词汇
  13. windows资源管理器关闭了怎么打开
  14. esc键退出全屏 vue_vue项目实现全屏,退出全屏,图标切换的解决方案
  15. 这是关于淘宝的一条重磅消息
  16. python倒计时定时器_使用python修饰器的定时器倒计时
  17. <table>表格标签属性
  18. 最新手机号正则表达式,及生成程序
  19. 高质量 iOS 博客推荐(iOS界技术大牛)
  20. Final Cut Pro X for Mac(FCPX专业视频剪辑软件) v10.4.6中文特别版

热门文章

  1. 【交通流理论拟合】-速度流量拟合
  2. 华为网络安全工程师:HCNA-Security(H12-711)题型解析(第二部分)-马青-专题视频课程...
  3. 在乌班图系统上安装yum
  4. 首个集成BNB应用侧链链游Meta Apes,必看全新测评与攻略
  5. java list对象转json_java中List对象转换为JSON对象
  6. 软件测试验收方法_验收测试是美丽的魔术。 这就是它可以改善您的生活的方法。...
  7. PMBOK第六版学习笔记
  8. k3刷机 重置_斐讯K3刷机教程:一直重启、忘了密码怎么办?手机刷机包下载
  9. MES系统介绍及MES系统开发费用明细
  10. matlab仿真不确定时滞系统容错控制,基于自适应方法的非线性系统容错控制