利用python合成视频,字幕,音频

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值