上一节中,实现了先生成一个固定背景的与音频长度一致的视频,然后插入字幕。再合并成一个视频的方法。
但是:这样有点单了,所以:
1.根据字幕的长度先生成视频片断
2.在片段上加上字幕。
3.合并所有片断,成为一个新的视频。
4.在新的视频上添加上音频。再次合成一个新的视频,即最后的视频。
可用代码1
from moviepy import VideoFileClip, AudioFileClip, TextClip, CompositeVideoClip, ImageClip
import cv2
import numpy as np
import random
import os
import warnings
# 忽略特定的 UserWarning
# warnings.filterwarnings("ignore", category=UserWarning, message="In file .*\.mp4, .* bytes wanted but 0 bytes read at frame index .* \(out of a total .* frames\), at time .* sec. Using the last valid frame instead.")
def parse_time(time_str):
""" 解析 SRT 时间格式 """
hours, minutes, seconds = time_str.split(':')
seconds, milliseconds = seconds.split(',')
return float(hours) * 3600 + float(minutes) * 60 + float(seconds) + float(milliseconds) / 1000
def create_video(audio_path, subtitle_path, video_path, subtitle_position='center', use_temp_files=False):
# 创建一个灰色背景的视频
width, height = 1920, 1080 # 横屏视频分辨率
fps = 24 # 视频帧率
duration = AudioFileClip(audio_path).duration # 视频时长与音频相同
# 加载音频
audio_clip = AudioFileClip(audio_path)
# 读取字幕文件
with open(subtitle_path, 'r', encoding='utf-8') as file:
subtitles = file.readlines()
# 处理字幕
video_clips = []
temp_files = [] # 用于存储临时文件路径
for i in range(0, len(subtitles), 3): # 4代表字幕文件中每一块所占行数
index = subtitles[i].strip()
time_range = subtitles[i + 1].strip().split(' --> ')
start_time = time_range[0]
end_time = time_range[1]
text = subtitles[i + 2].strip()
# 计算片段的持续时间
start_seconds = parse_time(start_time)
end_seconds = parse_time(end_time)
clip_duration = end_seconds - start_seconds
# 生成随机背景颜色
random_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
frame = np.zeros((height, width, 3), dtype=np.uint8)
frame[:, :] = random_color
# 创建视频片段
fourcc = cv2.VideoWriter_fourcc(*'