news 2026/4/28 6:38:40

使用 Python + FFmpeg 将 MP4 视频与 SRT 字幕无损合并(支持中文)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Python + FFmpeg 将 MP4 视频与 SRT 字幕无损合并(支持中文)

在日常视频处理场景中,我们经常需要将字幕(SRT)合并到视频中,尤其是从 YouTube、B 站等平台下载的视频,字幕通常是单独的.srt文件。

本文将介绍一种稳定、可复用、支持中文编码的方案:
👉 使用Python 调用 FFmpeg,将 MP4 视频与 SRT 字幕无损合并为一个新视频文件。


一、实现目标

  • ✅ 合并 MP4 视频 + SRT 字幕
  • ✅ 不重新编码视频 / 音频(速度快、无损)
  • ✅ 正确处理UTF-8 中文字幕
  • ✅ 设置字幕语言元数据(如chi
  • ✅ 封装为可复用的 Python 函数

二、环境准备

1️⃣ 安装 FFmpeg

Ubuntu / Debian
sudoaptinstallffmpeg
macOS(Homebrew)
brewinstallffmpeg
Windows
  • 下载:https://ffmpeg.org/download.html
  • 解压后将ffmpeg.exe加入系统PATH

验证是否安装成功:

ffmpeg -version

2️⃣ Python 环境

  • Python 3.7+
  • 无需额外第三方库(只使用标准库)

三、核心思路说明

我们要做的事情本质上就是执行下面这条 FFmpeg 命令:

ffmpeg -sub_charenc UTF-8\-i input.mp4\-i subtitle.srt\-c:v copy\-c:a copy\-c:s mov_text\-metadata:s:s:0language=chi\output.mp4

关键点解释:

参数作用
-sub_charenc UTF-8强制字幕编码为 UTF-8(防止中文乱码)
-c:v copy视频流不重新编码
-c:a copy音频流不重新编码
-c:s mov_textMP4 容器支持的字幕编码
language=chi设置字幕语言为中文

四、完整 Python 实现代码

importsubprocessimportosimportsysdefvalidate_file(file_path,file_type="file"):""" 校验文件是否存在 :param file_path: 文件路径 :param file_type: 文件类型描述(用于错误提示) """ifnotos.path.exists(file_path):raiseFileNotFoundError(f"{file_type}不存在:{file_path}")print(f"{file_type}校验通过:{file_path}")returnTruedefmerge_video_with_subtitles(video_path,srt_path,output_path):""" 使用 FFmpeg 将 MP4 视频与 SRT 字幕合并 不重新编码视频和音频,支持 UTF-8 中文字幕 """# 1. 校验输入文件是否存在validate_file(video_path,"视频文件")validate_file(srt_path,"字幕文件")# 2. 构建 FFmpeg 命令ffmpeg_cmd=["ffmpeg",# 输入视频文件"-i",video_path,# 输入字幕文件"-i",srt_path,# 视频流直接拷贝,不重新编码"-c:v","copy",# 音频流直接拷贝,不重新编码"-c:a","copy",# 将 SRT 转换为 MP4 支持的 mov_text 字幕格式"-c:s","mov_text",# 设置字幕语言元数据为中文"-metadata:s:s:0","language=chi",# 输出文件output_path]# 3. 强制指定字幕编码为 UTF-8,防止中文乱码ffmpeg_cmd.insert(3,"-sub_charenc")ffmpeg_cmd.insert(4,"UTF-8")try:# 4. 执行 FFmpeg 命令result=subprocess.run(ffmpeg_cmd,check=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)print(f"字幕合并成功,输出文件:{output_path}")exceptsubprocess.CalledProcessErrorase:# FFmpeg 执行失败时输出错误信息print("FFmpeg 执行失败:")print(e.stderr)raiseexceptExceptionase:# 其他异常print(f"执行过程中发生错误:{e}")raisedefmain():""" 主函数,定义输入输出路径 """# 视频文件路径video_path=r"SSYouTube.online_Gesture Drawing Practice _ 20 and 40 sec. poses_1080p.mp4"# 字幕文件路径srt_path=r"SSYouTube.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()exceptExceptionase:print(f"程序异常退出:{e}")sys.exit(1)

五、代码结构解析

1️⃣ 文件校验(防止低级错误)

validate_file(video_path,"video")validate_file(srt_path,"subtitle")
  • 避免 FFmpeg 报错才发现文件不存在
  • 提前失败,错误更友好

2️⃣ 为什么使用subprocess.run

优点:

  • ✔ 可控参数列表(避免 shell 注入)
  • ✔ 可捕获 stdout / stderr
  • ✔ 出错自动抛异常(check=True

3️⃣ 为什么选择mov_text

  • MP4 容器不支持直接嵌入 SRT
  • mov_text是 MP4 官方支持的字幕格式
  • 各大播放器(VLC、QuickTime、手机)兼容性好

六、常见问题与解决方案

❓ 中文字幕乱码?

✅ 一定要加:

-sub_charenc UTF-8

并确保.srt本身是 UTF-8 编码。


❓ 想把字幕“烧录”到画面中?

那就不能用-c:v copy,需要使用:

-vfsubtitles=xxx.srt

👉 这是硬字幕,不可关闭,且会重新编码(速度慢)。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 8:00:06

专业企业网站建设指南:价格、流程、注意事项一次说清

在数字化浪潮席卷各行各业的今天,企业网站已不再是互联网世界的"可选装饰",而是企业生存发展的战略必需品。它不仅是24小时在线的品牌展厅、业务窗口,更是连接客户、传递价值、驱动增长的核心数字枢纽。一个专业、高效、体验出色的…

作者头像 李华
网站建设 2026/4/26 11:12:21

微信小程序毕设项目:基于nodejs+微信小程序的垃圾分类和回收系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/26 5:53:50

微信小程序毕设项目:基于springboot+微信小程序的话剧票务管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/28 5:52:04

三招速查本机端口占用

1.如何查看本机端口占用 查看本机端口占用情况是网络调试、服务部署和故障排查的常见需求。不同操作系统提供了不同的命令行工具,以下是 Windows、Linux、macOS 三大平台的详细方法: ✅ 一、通用原理 操作系统内核维护一张 “网络连接与监听表”&#…

作者头像 李华
网站建设 2026/4/20 1:50:33

手搓HTML解析器:500行代码实现完整的DOM树构建

手搓HTML解析器:500行代码实现完整的DOM树构建引言:为什么需要理解HTML解析器?在Web开发中,DOM(文档对象模型)是我们与网页交互的核心接口。现代前端框架如React、Vue都构建在DOM之上,但很少有人…

作者头像 李华
网站建设 2026/4/25 23:19:21

STM32智慧路灯灯杆系统设计-太阳能风能风光互补-TP4056-升压-WiFi-高亮灯-光敏(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

23-270、STM32智慧路灯灯杆系统设计-太阳能风能风光互补-TP4056-升压-WiFi-高亮灯-光敏(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 产品功能描述: 本系统由STM32F103C8T6单片机核心板、太阳能电池板、风机发电…

作者头像 李华