本文目录导读:

- 方法一:使用 Python + EasyOCR(OCR识别)
- 方法二:使用 PaddleOCR(更精准)
- 方法三:使用 Whisper(语音识别)
- 方法四:使用 ffmpeg(提取软字幕)
- 方法五:使用视频字幕提取工具
- 安装依赖
- 使用建议
使用 Python + EasyOCR(OCR识别)
import easyocr
import cv2
from PIL import Image
import numpy as np
def extract_subtitles(video_path, frame_interval=2):
"""
从视频中提取字幕(通过OCR识别)
"""
# 初始化OCR
reader = easyocr.Reader(['ch_sim', 'en']) # 支持中英文
# 打开视频
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
subtitles = []
current_text = ""
for frame_num in range(0, total_frames, int(fps * frame_interval)):
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
ret, frame = cap.read()
if not ret:
break
# 提取字幕区域(通常是底部1/3)
height, width = frame.shape[:2]
subtitle_region = frame[int(height*0.7):, :]
# OCR识别
result = reader.readtext(subtitle_region)
text = ' '.join([item[1] for item in result])
if text and text != current_text:
subtitles.append({
'timestamp': frame_num / fps,
'text': text
})
current_text = text
cap.release()
return subtitles
# 使用示例s = extract_subtitles('your_video.mp4')
for sub in subtitles:
print(f"[{sub['timestamp']:.1f}s] {sub['text']}")
使用 PaddleOCR(更精准)
from paddleocr import PaddleOCR
import cv2
def extract_with_paddle(video_path, interval=1):
"""
使用PaddleOCR提取字幕
"""
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
cap = cv2.VideoCapture(video_path)
subtitles = []
fps = int(cap.get(cv2.CAP_PROP_FPS))
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
for i in range(0, total_frames, fps * interval):
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = cap.read()
if not ret:
break
# 获取字幕区域
h, w = frame.shape[:2]
roi = frame[int(h*0.7):, :]
# OCR识别
result = ocr.ocr(roi, cls=True)
if result:
text = ' '.join([line[1][0] for line in result[0]])
subtitles.append({
'time': i / fps,
'text': text
})
cap.release()
return subtitles
使用 Whisper(语音识别)
import whisper
def extract_with_whisper(video_path):
"""
使用OpenAI Whisper提取字幕(从音频)
"""
# 加载模型(支持多语言)
model = whisper.load_model("base")
# 识别
result = model.transcribe(video_path, language="zh")
# 输出字幕
for segment in result["segments"]:
print(f"[{segment['start']:.1f}s - {segment['end']:.1f}s] {segment['text']}")
# 保存为SRT格式
with open("subtitles.srt", "w", encoding="utf-8") as f:
for i, segment in enumerate(result["segments"], 1):
start = segment['start']
end = segment['end']
text = segment['text']
f.write(f"{i}\n")
f.write(f"{format_timestamp(start)} --> {format_timestamp(end)}\n")
f.write(f"{text}\n\n")
return result
def format_timestamp(seconds):
"""格式化时间戳"""
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
return f"{int(h):02d}:{int(m):02d}:{int(s):02d},000"
使用 ffmpeg(提取软字幕)
# 提取内嵌字幕流 ffmpeg -i input.mp4 -map 0:s:0 subtitles.srt # 列出所有字幕流 ffmpeg -i input.mp4 # 提取特定字幕流 ffmpeg -i input.mp4 -map 0:s:1 -f srt subtitle1.srt
使用视频字幕提取工具
import subprocess
import os
def extract_with_tool(video_path, output_srt="output.srt"):
"""
使用第三方工具(如VideoSubFinder等)
"""
# 确保安装了工具
if os.path.exists("VideoSubFinder_CLI"):
# 提取字幕帧
subprocess.run([
"./VideoSubFinder_CLI",
"-i", video_path,
"-o", "output_frames"
])
# OCR识别字幕帧
subprocess.run([
"tesseract",
"output_frames",
output_srt.replace('.srt', ''),
"-l", "chi_sim+eng"
])
安装依赖
# 方法一所需 pip install easyocr opencv-python # 方法二所需 pip install paddlepaddle paddleocr # 方法三所需 pip install openai-whisper # ffmpeg sudo apt install ffmpeg # Linux/macOS # Windows下载: https://ffmpeg.org/download.html
使用建议
- 字幕在画面底部:视频字幕通常在底部1/3区域
- 视频清晰度:清晰的视频OCR效果更好
- 字幕样式:颜色和字体影响识别准确率
- 性能优化:可以设置帧间隔,避免每帧都处理
需要我帮你实现其中某一种方法的具体应用吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播