Python結(jié)合FFmpeg實現(xiàn)將MP4視頻與SRT字幕無損合并
在日常視頻處理場景中,我們經(jīng)常需要將字幕(SRT)合并到視頻中,尤其是從 B 站等平臺下載的視頻,字幕通常是單獨的 .srt 文件。
本文將介紹一種穩(wěn)定、可復(fù)用、支持中文編碼的方案:使用 Python 調(diào)用 FFmpeg,將 MP4 視頻與 SRT 字幕無損合并為一個新視頻文件。
一、實現(xiàn)目標
- 合并 MP4 視頻 + SRT 字幕
- 不重新編碼視頻 / 音頻(速度快、無損)
- 正確處理 UTF-8 中文字幕
- 設(shè)置字幕語言元數(shù)據(jù)(如
chi) - 封裝為可復(fù)用的 Python 函數(shù)
二、環(huán)境準備
安裝 FFmpeg
Ubuntu / Debian
sudo apt install ffmpeg
macOS(Homebrew)
brew install ffmpeg
Windows
下載解壓后將 ffmpeg.exe 加入系統(tǒng) PATH
驗證是否安裝成功:
ffmpeg -version
Python 環(huán)境
- Python 3.7+
- 無需額外第三方庫(只使用標準庫)
三、核心思路說明
我們要做的事情本質(zhì)上就是執(zhí)行下面這條 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:0 language=chi \ output.mp4
關(guān)鍵點解釋:
| 參數(shù) | 作用 |
|---|---|
| -sub_charenc UTF-8 | 強制字幕編碼為 UTF-8(防止中文亂碼) |
| -c:v copy | 視頻流不重新編碼 |
| -c:a copy | 音頻流不重新編碼 |
| -c:s mov_text | MP4 容器支持的字幕編碼 |
| language=chi | 設(shè)置字幕語言為中文 |
四、完整 Python 實現(xiàn)代碼
import subprocess
import os
import sys
def validate_file(file_path, file_type="file"):
"""
校驗文件是否存在
:param file_path: 文件路徑
:param file_type: 文件類型描述(用于錯誤提示)
"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"{file_type} 不存在: {file_path}")
print(f"{file_type} 校驗通過: {file_path}")
return True
def merge_video_with_subtitles(video_path, srt_path, output_path):
"""
使用 FFmpeg 將 MP4 視頻與 SRT 字幕合并
不重新編碼視頻和音頻,支持 UTF-8 中文字幕
"""
# 1. 校驗輸入文件是否存在
validate_file(video_path, "視頻文件")
validate_file(srt_path, "字幕文件")
# 2. 構(gòu)建 FFmpeg 命令
ffmpeg_cmd = [
"ffmpeg",
# 輸入視頻文件
"-i", video_path,
# 輸入字幕文件
"-i", srt_path,
# 視頻流直接拷貝,不重新編碼
"-c:v", "copy",
# 音頻流直接拷貝,不重新編碼
"-c:a", "copy",
# 將 SRT 轉(zhuǎn)換為 MP4 支持的 mov_text 字幕格式
"-c:s", "mov_text",
# 設(shè)置字幕語言元數(shù)據(jù)為中文
"-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. 執(zhí)行 FFmpeg 命令
result = subprocess.run(
ffmpeg_cmd,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
print(f"字幕合并成功,輸出文件: {output_path}")
except subprocess.CalledProcessError as e:
# FFmpeg 執(zhí)行失敗時輸出錯誤信息
print("FFmpeg 執(zhí)行失敗:")
print(e.stderr)
raise
except Exception as e:
# 其他異常
print(f"執(zhí)行過程中發(fā)生錯誤: {e}")
raise
def main():
"""
主函數(shù),定義輸入輸出路徑
"""
# 視頻文件路徑
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()
except Exception as e:
print(f"程序異常退出: {e}")
sys.exit(1)
五、代碼結(jié)構(gòu)解析
文件校驗(防止低級錯誤)
validate_file(video_path, "video") validate_file(srt_path, "subtitle")
- 避免 FFmpeg 報錯才發(fā)現(xiàn)文件不存在
- 提前失敗,錯誤更友好
為什么使用subprocess.run
優(yōu)點:
- 可控參數(shù)列表(避免 shell 注入)
- 可捕獲 stdout / stderr
- 出錯自動拋異常(
check=True)
為什么選擇mov_text
- MP4 容器 不支持直接嵌入 SRT
mov_text是 MP4 官方支持的字幕格式- 各大播放器(VLC、QuickTime、手機)兼容性好
六、常見問題與解決方案
中文字幕亂碼
一定要加:
-sub_charenc UTF-8
并確保 .srt 本身是 UTF-8 編碼。
想把字幕“燒錄”到畫面中
那就不能用 -c:v copy,需要使用:
-vf subtitles=xxx.srt
這是 硬字幕,不可關(guān)閉,且會重新編碼(速度慢)。
以上就是Python結(jié)合FFmpeg實現(xiàn)將MP4視頻與SRT字幕無損合并的詳細內(nèi)容,更多關(guān)于Python FFmpeg視頻字幕合并的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python爬取小姐姐圖片(beautifulsoup法)
這篇文章主要介紹了Python爬取小姐姐圖片(beautifulsoup法),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
tensorflow tf.train.batch之數(shù)據(jù)批量讀取方式
今天小編就為大家分享一篇tensorflow tf.train.batch之數(shù)據(jù)批量讀取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python實現(xiàn)帶參數(shù)與不帶參數(shù)的多重繼承示例
這篇文章主要介紹了Python實現(xiàn)帶參數(shù)與不帶參數(shù)的多重繼承,結(jié)合具體實例形式對比分析了Python實現(xiàn)帶參數(shù)與不帶參數(shù)的多重繼承相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Nginx搭建HTTPS服務(wù)器和強制使用HTTPS訪問的方法
這篇文章主要介紹了Nginx搭建HTTPS服務(wù)器和強制使用HTTPS訪問的方法,即從HTTP跳轉(zhuǎn)到HTTPS,需要的朋友可以參考下2015-08-08

