如何基于MoviePy为Python视频处理程序添加居中字幕?
为MoviePy视频处理程序添加居中字幕解决方案
问题背景
基于Python的MoviePy库开发视频处理程序,已实现以下功能:
- 将TTS音频(
output-tts.mp3)与背景音乐结合 - 将游戏画面素材裁剪为9:16比例
- 匹配音频与视频时长
此前尝试用ImageMagick添加字幕时出现多种问题:背景空白、文本无法修改、视频比例超出9:16、生成无效长视频,现需添加实现居中字幕的代码。
解决方案代码
以下是整合了居中字幕功能的完整代码,支持静态整段字幕或动态时间轴字幕两种方式:
from moviepy.editor import ( AudioFileClip, CompositeAudioClip, VideoFileClip, TextClip, CompositeVideoClip, SubtitlesClip ) import json # 路径配置 background_video_path = "src/bgvid.mp4" output_audio_path = "output/output-tts.mp3" output_video_path = "output/output-with-subtitles.mp4" # 若使用动态字幕,需准备SRT字幕文件路径 subtitle_srt_path = "subtitles.srt" # 读取配置文件 with open("config.json", "r") as json_file: data = json.load(json_file) # 加载并处理音频 song_clip = AudioFileClip(data["song"]).volumex(0.09) # 背景音乐音量调整 tts_clip = AudioFileClip(output_audio_path) # 匹配音频时长 min_duration = min(song_clip.duration, tts_clip.duration) song_clip = song_clip.subclip(0, min_duration) tts_clip = tts_clip.subclip(0, min_duration) combined_audio = CompositeAudioClip([song_clip, tts_clip]) # 裁剪并处理背景视频(补全9:16裁剪逻辑) def crop_video(video_path): video = VideoFileClip(video_path) target_aspect = 9 / 16 current_aspect = video.w / video.h if current_aspect > target_aspect: # 宽屏裁剪高度 new_width = int(video.h * target_aspect) x_center = video.w / 2 video = video.crop(x1=x_center - new_width/2, x2=x_center + new_width/2) else: # 竖屏裁剪宽度 new_height = int(video.w / target_aspect) y_center = video.h / 2 video = video.crop(y1=y_center - new_height/2, y2=y_center + new_height/2) return video cropped_video = crop_video(background_video_path) cropped_video = cropped_video.subclip(0, min_duration).set_audio(combined_audio) # --- 字幕添加部分 --- # 方式1:静态字幕(整段视频显示同一文本) # text_clip = TextClip( # "这里是你的静态字幕内容", # fontsize=50, # color="white", # font="SimHei", # 指定中文字体避免乱码,可替换为系统支持的字体 # stroke_color="black", # 添加描边增强可读性 # stroke_width=2 # ) # text_clip = text_clip.set_position("center").set_duration(min_duration) # 方式2:动态时间轴字幕(加载SRT字幕文件) def make_text_clip(txt): return TextClip( txt, fontsize=45, color="white", font="SimHei", stroke_color="black", stroke_width=2 ) subtitles = SubtitlesClip(subtitle_srt_path, make_text_clip) # 合成带字幕的最终视频 # 若用静态字幕,替换subtitles为text_clip final_video = CompositeVideoClip([cropped_video, subtitles]) # 导出视频 final_video.write_videofile( output_video_path, codec='libx264', audio_codec='aac', fps=24, threads=4 # 多线程加速导出 )
关键说明
- 字体设置:必须指定支持中文的字体(如
SimHei),避免字幕乱码;若系统无该字体,可替换为字体文件路径(如font="path/to/your/font.ttf") - 字幕可读性:添加
stroke_color和stroke_width为文本加描边,避免字幕与视频背景融合 - 动态字幕SRT格式:SRT文件需符合标准格式,示例如下:
1 00:00:00,000 --> 00:00:03,000 第一句字幕内容 2 00:00:03,000 --> 00:00:06,000 第二句字幕内容 - ImageMagick配置:确保已安装ImageMagick,Windows用户需在代码开头添加
import os; os.environ["IMAGEMAGICK_BINARY"] = "path/to/convert.exe"指定工具路径
内容的提问来源于stack exchange,提问作者flip
相关产品推荐
相关产品推荐

