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)
利用python合成视频,字幕,音频
于 2025-02-10 23:46:37 首次发布