如何为MoviePy中SubtitlesClip的字幕添加淡入淡出效果并处理时间戳?
为字幕添加淡入淡出效果的实现方法及时间戳获取方案
一、实现字幕淡入淡出的两种方法
1. 给整个字幕片段添加全局淡入淡出
直接调用MoviePy的fadein()和fadeout()方法,为截取后的字幕片段添加效果,注意调整方法调用顺序以保证时间线正确:
generator = lambda txt: TextClip(txt, font='Font.otf', fontsize=18, color='white') # 先截取原字幕19-35秒的内容,再设置在主视频1秒处开始,最后添加淡入淡出 subtitles = SubtitlesClip('subs.srt', generator).subclip(19, 35).set_start(1) # 配置淡入淡出时长(示例为0.5秒) subtitles = subtitles.fadein(0.5).fadeout(0.5) video = CompositeVideoClip([clip, subtitles]) video.write_videofile("crop.mp4", fps=30, codec="libx264", audio=False, preset='veryfast')
2. 为单条字幕逐个添加淡入淡出
如果需要更精细的控制,修改字幕生成器,给每条生成的TextClip单独添加淡入淡出效果:
def subtitle_generator(txt): text_clip = TextClip(txt, font='Font.otf', fontsize=18, color='white') # 为单条字幕配置0.3秒的淡入淡出 return text_clip.fadein(0.3).fadeout(0.3) subtitles = SubtitlesClip('subs.srt', subtitle_generator).subclip(19, 35).set_start(1) video = CompositeVideoClip([clip, subtitles]) video.write_videofile("crop.mp4", fps=30, codec="libx264", audio=False, preset='veryfast')
二、获取处理后字幕的时间戳
1. 获取整个字幕片段的时间范围
直接访问片段的start和end属性,就能得到该片段在合成视频中的起始与结束时间:
generator = lambda txt: TextClip(txt, font='Font.otf', fontsize=18, color='white') subtitles = SubtitlesClip('subs.srt', generator).subclip(19, 35).set_start(1) # 打印整体时间范围 print("字幕片段起始时间:", subtitles.start) print("字幕片段结束时间:", subtitles.end)
这里的start就是你设置的1秒,end为1 + (35-19) = 17秒,即片段总时长是截取的原字幕时长加上偏移量。
2. 获取每条字幕的具体播放时间
遍历SubtitlesClip的subs属性,得到每条字幕的原时间戳后,加上set_start的偏移量(1秒)就是实际播放时间:
for sub_entry in subtitles.subs: # sub_entry格式为 (原起始时间, 原结束时间, 字幕文本) actual_start = sub_entry[0] + 1 actual_end = sub_entry[1] + 1 print(f"字幕文本:{sub_entry[2]},实际起始时间:{actual_start}s,实际结束时间:{actual_end}s")
内容的提问来源于stack exchange,提问作者wrench
相关产品推荐
相关产品推荐

