字幕文件读取
# 读取字幕文件
def read_srt(path):
content = ""
with open(path,'r', encoding='UTF-8') as f:
content = f.read()
return content
# 字幕拆分
def get_sequences(content):
sequences = content.split('\n\n')
sequences = [sequence.split('\n') for sequence in sequences]
# 去除每一句空值
sequences = [list(filter(None, sequence)) for sequence in sequences]
# 去除整体空值
return list(filter(None, sequences))
srt_path='./audio/333.zh-cn.srt'
content = read_srt(srt_path)
sequences = get_sequences(content)
print(sequences)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
结果:
[[‘1’, ‘00:00:00,000 --> 00:00:00,790’, ‘活着’],
[‘2’, ‘00:00:01,730 --> 00:00:02,860’, ‘所为何事先生’],
[‘3’, ‘00:00:03,140 --> 00:00:05,010’, ‘我们在京城有一箱22任务’],
[‘4’, ‘00:00:05,230 --> 00:00:06,440’, ‘把这些人找过来’],
[‘5’, ‘00:00:07,010 --> 00:00:08,230’, ‘你就要辛苦一下了’], [‘6’, ‘00:00:09,290 --> 00:00:10,900’, ‘这一次我们要一起合作’], [‘7’, ‘00:00:11,020 --> 00:00:12,040’, ‘有目标是谁’],。。。
转换时间
strTime= '00:00:58,990'
def strFloatTime(tempStr):
xx = tempStr.split(':')
hour = int(xx[0])
minute = int(xx[1])
second = int(xx[2].split(',')[0])
minsecond = int(xx[2].split(',')[1])
allTime = hour * 60 * 60 + minute * 60 + second + minsecond / 1000
return allTime
print(strFloatTime(strTime))
1
2
3
4
5
6
7
8
9
10
11
结果:58.99
字幕挂载
from os.path import splitext, isfile
from moviepy.editor import (VideoFileClip,
TextClip,
CompositeVideoClip)
# 读取字幕文件
def read_srt(path):
content = ""
with open(path, 'r', encoding='UTF-8') as f:
content = f.read()
return content
# 字幕拆分
def get_sequences(content):
sequences = content.split('\n\n')
sequences = [sequence.split('\n') for sequence in sequences]
# 去除每一句空值
sequences = [list(filter(None, sequence)) for sequence in sequences]
# 去除整体空值
return list(filter(None, sequences))
def strFloatTime(tempStr):
xx = tempStr.split(':')
hour = int(xx[0])
minute = int(xx[1])
second = int(xx[2].split(',')[0])
minsecond = int(xx[2].split(',')[1])
allTime = hour * 60 * 60 + minute * 60 + second + minsecond / 1000
return allTime
class RealizeAddSubtitles():
'''
合成字幕与视频
'''
def __init__(self, videoFile, txtFile):
self.src_video = videoFile
self.sentences = txtFile
if not (isfile(self.src_video) and self.src_video.endswith(('.avi', '.mp4')) and isfile(
self.sentences) and self.sentences.endswith('.srt')):
print('视频仅支持avi以及mp4,字幕仅支持srt格式')
else:
video = VideoFileClip(self.src_video)
# 获取视频的宽度和高度
w, h = video.w, video.h
# 所有字幕剪辑
txts = []
content = read_srt(self.sentences)
sequences = get_sequences(content)
for line in sequences:
if len(line)<3:
continue
sentences = line[2]
start = line[1].split(' --> ')[0]
end = line[1].split(' --> ')[1]
start=strFloatTime(start)
end=strFloatTime(end)
start, end = map(float, (start, end))
span=end-start
txt = (TextClip(sentences, fontsize=40,
font='SimHei', size=(w - 20, 40),
align='center', color='red')
.set_position((10, h - 150))
.set_duration(span)
.set_start(start))
txts.append(txt)
# 合成视频,写入文件
video = CompositeVideoClip([video, *txts])
fn, ext = splitext(self.src_video)
video.write_videofile(f'{fn}_2带字幕{ext}')
if __name__ == '__main__':
'''调用方法示例'''
srt_path = './audio/333.zh-cn.srt'
addSubtitles = RealizeAddSubtitles('./audio/clip.mp4', srt_path)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
参考网页
https://blog.youkuaiyun.com/weixin_42081389/article/details/104322629
https://www.mdeditor.tw/pl/p7Q8
https://blog.youkuaiyun.com/weixin_46304253/article/details/109157104
https://blog.youkuaiyun.com/jining11/article/details/108016151
————————————————
版权声明:本文为优快云博主「四月的我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_40584593/article/details/110353923