import subprocess
video_path = "input_video.mp4"
audio_path = "input_audio.mp3"
subtitle_path = "input_audio.srt"
output_path = "output_video_with_subtitles.mp4"
def get_audio_duration(audio_path):
result = subprocess.run(
["ffprobe", "-i", audio_path, "-show_entries", "format=duration", "-v", "quiet", "-of", "csv=p=0"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
return float(result.stdout.strip())
def get_video_duration(video_path):
result = subprocess.run(
["ffprobe", "-i", video_path, "-show_entries", "format=duration", "-v", "quiet", "-of", "csv=p=0"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
return float(result.stdout.strip())
def adjust_video_speed(video_path, audio_duration, adjusted_video_path):
video_duration = get_video_duration(video_path)
speed_factor = video_duration / audio_duration
subprocess.run([
"ffmpeg",
"-i", video_path,
"-vf", f"setpts={1/speed_factor}*PTS",
"-af", f"atempo={speed_factor}",
"-c:v", "libx264",
"-c:a", "aac",
"-y",
adjusted_video_path
])
def process_video(video_path, audio_path, subtitle_path, output_path):
audio_duration = get_audio_duration(audio_path)
print(f"音频时长: {audio_duration} 秒")
adjusted_video_path = "adjusted_video.mp4"
adjust_video_speed(video_path, audio_duration, adjusted_video_path)
subprocess.run([
"ffmpeg",
"-i", adjusted_video_path,
"-i", audio_path,
"-vf", f"subtitles={subtitle_path}:force_style='PrimaryColour=&HFFFFFF,OutlineColour=&HFF0000,Outline=1,Alignment=10,Fontsize=24'",
"-c:v", "libx264",
"-c:a", "aac",
"-map", "0:v:0",
"-map", "1:a:0",
"-shortest",
"-y",
output_path
])
print(f"视频已生成并保存到 {output_path}")
process_video(video_path, audio_path, subtitle_path, output_path)