# Python应用-vtt字幕转srt字幕
文章为原创手写,如需转发请贴上原文地址,谢谢!
# 应用场景
今天下载了一堆mp4视频,但是字幕是vtt格式的,发现这是web html5比较常用的字幕格式,本地播放器的话用的还是srt多一点。两个文件打开对比了下发现差别也不是很大,为了后面定制化地适应新的需求,决定写一个Python的脚本。
# 明确需求
看下vtt的文件:
看下srt的文件:
# 分析差异
- vtt文件是WEBVTT开头,srt没有
- srt没个段落开头都有一个序号,vtt没有
- srt以","为分隔符,vtt以"."为分隔符。关于这点不知道两个格式的标准也在进化,我刚开始并没有替换"."也能使用。srt用"."作为分隔符也没有问题。
# 以下为实现代码
import os
import re
def traverseFolder(targetFolder):
if(targetFolder[-1]==os.path.sep):
targetFolder=targetFolder[0:-1]
for root, dirs, files in os.walk(targetFolder):
for oneFile in files:
vtt2srt(root+os.path.sep+oneFile)
def vtt2srt(filePath):
fileSplitName=os.path.splitext(filePath)
if(fileSplitName[1]==".vtt"):
print("Processing with file: "+filePath)
with open(filePath,"r",encoding="utf-8") as fin:
fileContent=fin.readlines()
lineNum=2
fileMaxLineNum=len(fileContent)
with open(fileSplitName[0]+".srt","w",encoding="utf-8") as fout:
fout.write("1\n")
for i in range(2,fileMaxLineNum):
if(fileContent[i].strip().isdigit()):
continue
#tempStr=fileContent[i].replace(".",",")
if re.match(r"(\d\d:\d\d:)",fileContent[i])==None :
fout.write(re.sub(r"(\d\d:)",lambda m:"00:"+m.group(0),fileContent[i]))
else:
fout.write(fileContent[i])
if(fileContent[i].strip()=="" and i+1<fileMaxLineNum and fileContent[i+1].strip()!=""):
fout.write(str(lineNum)+"\n")
lineNum+=1
targetFolder=input("请输入一个目录:")
traverseFolder(targetFolder)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
traverseFolder函数是遍历文件夹获得所有文件的。
vtt2srt函数是做具体转换处理的。