核心思路
使用 OpenCV 播放视频的基本流程非常简单,可以类比于播放幻灯片:

- 加载视频:使用
cv2.VideoCapture()打开一个视频文件(或摄像头)。 - 循环读取帧:在一个
while循环中,不断调用cap.read()方法来读取视频的每一帧(可以理解为每一张图片)。 - 显示帧:使用
cv2.imshow()将读取到的帧显示在窗口中。 - 退出条件:当用户按下某个键('q')或者视频播放完毕时,退出循环。
- 释放资源:关闭视频文件和所有 OpenCV 窗口,释放资源。
基础示例:播放本地视频文件
这是最常见的情况,播放一个存储在你电脑上的视频文件(如 .mp4, .avi, .mov 等)。
代码
import cv2
import time
# --- 1. 加载视频 ---
# 替换成你的视频文件路径
video_path = 'my_video.mp4'
# 创建一个 VideoCapture 对象
# 参数 0 表示使用默认的摄像头
# 如果要播放文件,传入文件路径字符串
cap = cv2.VideoCapture(video_path)
# 检查视频是否成功加载
if not cap.isOpened():
print("错误:无法打开视频文件")
exit()
# --- 2. 循环读取和显示帧 ---
while True:
# cap.read() 返回两个值:
# 1. a boolean (ret), 如果成功读取到帧,则为 True,否则为 False (视频结束)
# 2. the frame itself (frame)
ret, frame = cap.read()
# ret 为 False,表示视频已经播放完毕
if not ret:
print("视频播放完毕")
break
# --- 3. 显示帧 ---
# 'Video Player' 是窗口的名称
cv2.imshow('Video Player', frame)
# --- 4. 设置退出条件 ---
# cv2.waitKey(1) 等待 1 毫秒,看是否有按键按下
# 如果按下 'q' 键,则退出循环
# ord('q') 获取 'q' 字符的 ASCII 码
if cv2.waitKey(1) & 0xFF == ord('q'):
print("用户按下 'q' 键,退出播放")
break
# --- 5. 释放资源 ---
# 关闭 VideoCapture 对象
cap.release()
# 关闭所有由 OpenCV 创建的窗口
cv2.destroyAllWindows()
print("播放结束,资源已释放。")
如何运行
- 确保你已经安装了 OpenCV 和 NumPy:
pip install opencv-python numpy - 将上面的代码保存为一个 Python 文件(
play_video.py)。 - 将
video_path变量的值修改为你电脑上视频文件的正确路径。 - 在终端中运行:
python play_video.py
代码解释

cv2.VideoCapture(video_path): 这是最关键的一步,它创建了一个对象来“捕获”视频源。cap.isOpened(): 一个好习惯,在尝试读取之前检查视频是否真的被成功打开了。cap.read(): 每次调用它,它会从视频中读取下一帧。ret是一个布尔值,用于判断是否成功读取,当视频结束时,ret会变为False。cv2.imshow(): 在一个新窗口中显示图像,第一个参数是窗口的标题,第二个参数是要显示的图像数据(即frame)。cv2.waitKey(1): 非常重要! 如果没有这行代码,imshow窗口可能会卡住或无法正常显示,它的作用是等待指定毫秒数,看是否有键盘事件发生,参数1表示等待 1 毫秒,这样循环才能以接近视频原始帧率的速度运行。0xFF == ord('q'): 这是一个判断按键的技巧。cv2.waitKey()返回的是按键的 ASCII 码。& 0xFF是为了确保在所有系统上都能正确工作。cap.release(): 关闭视频文件,释放相关资源。必须调用!cv2.destroyAllWindows(): 关闭所有由cv2.imshow创建的窗口。
高级功能与技巧
掌握了基础后,我们可以添加一些高级功能,让播放器更强大。
1 获取视频信息(帧率、尺寸、总帧数)
在播放前,我们可以获取视频的元数据,这对于调试或自定义播放逻辑很有用。
import cv2
video_path = 'my_video.mp4'
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print("错误:无法打开视频文件")
exit()
# --- 获取视频信息 ---
# 获取视频的宽度、高度和通道数
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 总帧数
print(f"视频信息:")
print(f" - 宽度: {width}")
print(f" - 高度: {height}")
print(f" - 帧率: {fps:.2f} FPS")
print(f" - 总帧数: {frame_count}")
# ... (接下来的播放循环代码与基础示例相同) ...
cap.release()
cv2.destroyAllWindows()
2 控制播放速度
cv2.waitKey() 的参数直接控制了每帧显示的时长,从而间接控制了播放速度。
- 正常速度:
cv2.waitKey(int(1000 / fps))。1000 / fps得到每帧应该显示的毫秒数。 - 慢速播放:增加
waitKey的值,cv2.waitKey(50)(每帧显示50ms)。 - 快速播放:减少
waitKey的值,cv2.waitKey(1)(每帧显示1ms)。
示例代码

# ... 在播放循环内部 ...
while True:
ret, frame = cap.read()
if not ret:
break
# 控制播放速度为正常速度的一半
# 计算正常每帧的延迟时间
delay = int(1000 / fps)
# 延迟加倍,实现慢速播放
if cv2.waitKey(delay * 2) & 0xFF == ord('q'):
break
3 播放视频时添加文字(水印)
你可以在播放的每一帧上绘制文字,比如时间戳、标题或水印。
import cv2
import time
video_path = 'my_video.mp4'
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
exit()
fps = cap.get(cv2.CAP_PROP_FPS)
while True:
ret, frame = cap.read()
if not ret:
break
# --- 在帧上添加文字 ---
# cv2.putText(图像, 文字, 坐标, 字体, 大小, 颜色, 线条厚度)
text = "OpenCV Video Player"
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
font_color = (0, 255, 0) # BGR 格式的绿色
font_thickness = 2
text_position = (50, 50) # 左上角坐标
cv2.putText(frame, text, text_position, font, font_scale, font_color, font_thickness)
cv2.imshow('Video Player with Text', frame)
if cv2.waitKey(int(1000 / fps)) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
4 从摄像头实时捕获
播放视频文件的逻辑几乎完全适用于从摄像头捕获实时画面,你只需要将 cv2.VideoCapture() 的参数从文件路径改为摄像头索引即可。
cv2.VideoCapture(0): 通常表示使用电脑的默认摄像头。cv2.VideoCapture(1): 表示使用第二个连接的摄像头(如果有)。
示例代码
import cv2
# --- 1. 加载摄像头 ---
# 0 是默认摄像头的索引
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("错误:无法打开摄像头")
exit()
print("摄像头已打开,按 'q' 键退出...")
# --- 2. 循环读取和显示帧 ---
while True:
ret, frame = cap.read()
if not ret:
print("无法从摄像头获取帧,退出...")
break
# 可以在这里对帧进行处理,例如转换为灰度图
# gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# cv2.imshow('Camera Feed (Gray)', gray_frame)
cv2.imshow('Camera Feed', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# --- 3. 释放资源 ---
cap.release()
cv2.destroyAllWindows()
print("摄像头已关闭。")
| 功能 | 关键代码/函数 | 说明 |
|---|---|---|
| 加载视频 | cv2.VideoCapture('path/to/video.mp4') |
创建视频捕获对象,文件路径或摄像头索引。 |
| 检查加载 | cap.isOpened() |
确认视频或摄像头是否成功打开。 |
| 读取帧 | ret, frame = cap.read() |
在循环中调用,读取下一帧。ret 为 False 时结束。 |
| 显示帧 | cv2.imshow('Window Name', frame) |
在窗口中显示当前帧。 |
| 控制速度/退出 | cv2.waitKey(delay) |
等待 delay 毫秒,用于控制播放速度和检测按键。 |
| 获取信息 | cap.get(cv2.CAP_PROP_FPS) |
获取视频的帧率、宽度、高度等属性。 |
| 释放资源 | cap.release() 和 cv2.destroyAllWindows() |
必须调用!关闭视频流和窗口,防止资源泄漏。 |
希望这个详细的指南能帮助你完全掌握在 Python 中使用 OpenCV 播放视频的技巧!
