Python3结合ffmpeg给视频添加字幕和语音

说明:

本文内容经过ChatGPT润色,代码为个人手写,如有不适,请多包涵。

在视频制作中,为视频添加声音和字幕是常见的需求。通过Python结合FFmpeg,我们可以高效地实现这些功能。本文将介绍如何使用Python脚本和FFmpeg命令来处理视频,添加声音和字幕,以提升视频的观赏性和信息传达效果。

环境准备

在开始之前,请确保您已经安装了FFmpeg和Python环境。您可以通过以下方式检查FFmpeg是否安装:

ffmpeg -version

如果没有安装FFmpeg,请访问FFmpeg官网进行下载安装。

接下来,安装Python依赖库。我们将使用subprocess来运行FFmpeg命令,还会用到loguru库来进行日志记录。您可以使用以下命令安装loguru

pip install loguru
脚本概述

我们将实现两个主要功能:

  1. 为视频添加背景音乐或声音。
  2. 为视频添加字幕。

以下是实现这些功能的Python脚本:

import subprocess
import os
from loguru import logger

def video_add_to_voice(video_path, voice_path, save_path, video_time):
    """
    视频添加声音或背景音乐
    :param video_path:
    :param voice_path:
    :param save_path:
    :param video_time:
    :return:
    """
    finally_video = voice_path
    if voice_path:
        try:
            def add_background_music_to_video(video_path, music_path, output_path, t=20):
                ffmpeg_command = [
                    'ffmpeg',
                    '-i', video_path,
                    '-stream_loop', '-1',
                    '-i', music_path,
                    '-filter_complex', "[1:a]aloop=loop=-1",
                    '-t', f'{t}',
                    '-c:v', 'copy',
                    '-preset', 'faster',
                    '-y',
                    output_path
                ]
                return ffmpeg_command

            # 加音乐后的视频路径和名字
            music_local_path = os.path.join(save_path, 'm').replace("\\", '/') + '.mp4'

            add_music_command = add_background_music_to_video(video_path, voice_path, music_local_path, video_time)
            subprocess.run(add_music_command, check=True, timeout=300)
            finally_video = music_local_path
        except Exception as e:
            print(format(e))
            pass

    logger.info(f'添加voice后的本地路径:{finally_video}')
    return finally_video


def video_add_to_srt(video_path, srt_path, save_path):
    """
    视频添加字幕
    :param video_path:
    :param srt_path:
    :param save_path:
    :return:
    """
    finally_video = video_path
    if srt_path:
        try:
            srt_local_path = os.path.join(save_path, 's').replace("\\", '/') + '.mp4'
            command = [
                "ffmpeg",
                "-i", video_path,
                "-vf", f"subtitles={srt_path}:force_style='FontName=Arial,FontSize=14,FontColor=yellow'",
                "-c:a", "copy",
                '-preset', 'faster',
                srt_local_path
            ]

            subprocess.run(command, check=True, timeout=300)
            finally_video = srt_local_path
        except Exception as e:
            logger.info(format(e))
    return finally_video


if __name__ == '__main__':
    video = 'room.mp4'
    srt = 'room.srt'
    voice = 'room.mp3'
    save_path = './video'
    time = 60
    voice_video_path = video_add_to_voice(video, voice, save_path, time)

    srt_video_path = video_add_to_srt(voice_video_path, srt, save_path)

    logger.info(f'添加字幕声音后视频地址:{srt_video_path}')
详细讲解
  1. 添加声音或背景音乐

    函数video_add_to_voice实现了将背景音乐添加到视频的功能。首先,它定义了一个内部函数add_background_music_to_video,该函数通过FFmpeg命令将音乐循环到视频的时长中。

    • '-stream_loop', '-1':表示音乐文件将无限循环。
    • '-filter_complex', "[1:a]aloop=loop=-1":指定音频的循环过滤器。
    • '-t', f'{t}':设置视频的时长为参数t(单位为秒)。
    • '-c:v', 'copy':保持视频编码不变。

    音频处理完成后,生成的文件路径会被返回以供后续操作使用。

  2. 添加字幕

    函数video_add_to_srt负责将字幕添加到视频中。它利用FFmpeg的-vf选项来应用字幕文件。

    • '-vf', f"subtitles={srt_path}:force_style='FontName=Arial,FontSize=14,FontColor=yellow'":使用subtitles过滤器,将字幕添加到视频中,并设置字幕样式(字体、大小、颜色等)。
    • '-c:a', "copy":保持音频编码不变。

    处理完成后,生成的带字幕的视频路径会被返回。

使用示例

在脚本的__main__部分,我们提供了一个示例如何调用这些函数:

  • video_add_to_voice:将指定的音频文件添加到视频中。
  • video_add_to_srt:将字幕文件添加到处理过的带音乐的视频中。

通过这些步骤,您可以生成带有音频和字幕的视频,以满足不同的需求。这个过程可以应用于各种场景,如制作教育视频、娱乐视频或任何需要多媒体元素的视频项目。

总结

通过结合使用Python和FFmpeg,我们可以有效地为视频添加声音和字幕。这个脚本不仅提高了处理视频的效率,还能通过自定义参数满足不同的需求。希望这篇文章能帮助您理解并应用这些技术,让您的视频处理工作变得更加轻松和高效。如果您对视频处理有更高的要求或其他问题,欢迎继续探索和实践!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值