📌 摘要
本文介绍如何使用 Python 调用 FFmpeg,将 视频文件(MP4)与字幕文件(SRT)进行无损合并,并输出带字幕的新视频。文中提供了完整可运行的 Python 脚本,包括文件校验、FFmpeg 调用、错误处理等。适用于想要批量合并视频 + 字幕、制作教学视频、课程字幕嵌入等场景。
🎯 一、背景需求
在视频编辑、课程制作、影视处理等场景中,我们经常需要:
-
下载的视频没有内嵌字幕
-
手里有
.srt字幕文件 -
需要把字幕"封装"到
.mp4里(但不烧录,只是内封)
使用 FFmpeg 可以轻松做到,而 Python 则可以让流程自动化、批量化。
🔧 二、实现原理
FFmpeg 提供了丰富的视频/音频/字幕处理功能,这里我们用到:
ffmpeg -i video.mp4 -i subtitle.srt -c:v copy -c:a copy -c:s mov_text output.mp4
说明:
-
-c:v copy:不重新编码视频(无损、快速) -
-c:a copy:不重新编码音频 -
-c:s mov_text:将 SRT 封装为 MP4 支持的字幕格式 -
使用 Python 的
subprocess.run()调用 FFmpeg
📦 三、依赖环境
你的系统需要安装:
✔ Python 3.x
✔ FFmpeg(必需)
检查 FFmpeg 是否安装:
ffmpeg -version
没有安装请到官网或使用包管理工具安装。
🧩 四、完整 Python 代码(含中文注释)
下面是可直接运行的脚本,已加上完整中文说明,适合新手和入门 FFmpeg/Python 的读者:
import subprocess
import os
import sys
def validate_file(file_path, file_type="file"):
"""验证文件是否存在"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"{file_type.capitalize()} 文件不存在: {file_path}")
print(f"{file_type.capitalize()} 已验证: {file_path}")
return True
def merge_video_with_subtitles(video_path, srt_path, output_path):
"""使用 FFmpeg 将视频与 SRT 字幕合并"""
# 1. 验证输入文件
validate_file(video_path, "video")
validate_file(srt_path, "subtitle")
# 2. FFmpeg 指令
ffmpeg_cmd = [
'ffmpeg',
'-i', video_path, # 输入视频
'-i', srt_path, # 输入字幕
'-c:v', 'copy', # 视频无损copy
'-c:a', 'copy', # 音频无损copy
'-c:s', 'mov_text', # 字幕转换为 mp4 可识别格式
'-metadata:s:s:0', 'language=chi', # 字幕语言设置为中文
output_path
]
# 强制字幕按 UTF-8 解码(避免乱码)
ffmpeg_cmd.insert(3, '-sub_charenc')
ffmpeg_cmd.insert(4, 'UTF-8')
try:
# 3. 调用 FFmpeg 进行处理
result = subprocess.run(
ffmpeg_cmd,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
print(f"成功生成视频: {output_path}")
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"FFmpeg 处理失败: {e.stderr}")
raise
except Exception as e:
print(f"运行 FFmpeg 时发生异常: {e}")
raise
def main():
# 输入文件路径(可自行修改)
video_path = r"SS.online_Gesture Drawing Practice _ 20 and 40 sec. poses_1080p.mp4"
srt_path = r"SS.online_Gesture Drawing Practice _ 20 and 40 sec. poses_1080p.srt"
output_path = "output.mp4"
# 合并视频 + 字幕
merge_video_with_subtitles(video_path, srt_path, output_path)
if __name__ == "__main__":
try:
main()
except Exception as e:
print(f"程序错误: {e}")
sys.exit(1)
▶️ 五、运行方式
直接:
python merge.py
执行完成后,将生成:
output.mp4
用任意播放器(如 VLC)打开 → 字幕即可选择显示。
📝 六、说明与注意事项
1. 字幕不会"烧录"
此方法是 内封字幕(soft subtitle),播放器可以选择开启/关闭。
2. 字幕乱码?
可尝试:
-sub_charenc UTF-8
代码中已自动加入该选项。
3. 多字幕?
支持。可扩展代码进行批量字幕封装。
4. 输出文件不会重新压制视频
因为:
-c:v copy -c:a copy
速度极快(几秒内完成)。