
本文详解如何使用opencv和python遍历文件夹中全部mp4文件,并按序逐个打开、播放直至结束,自动切换至下一个视频;同时修正原代码中循环结构错位、资源释放不当及语法冗余等关键问题。
本文详解如何使用opencv和python遍历文件夹中全部mp4文件,并按序逐个打开、播放直至结束,自动切换至下一个视频;同时修正原代码中循环结构错位、资源释放不当及语法冗余等关键问题。
要实现“读取并顺序播放文件夹内所有 .mp4 视频(如 1.mp4 → 2.mp4 → …)”,核心在于:每个视频的打开、逐帧读取、显示与释放必须完整封装在针对单个文件的处理逻辑内。原代码将 cv2.VideoCapture(tt) 和播放循环置于外层 for file in files 循环之外,导致仅处理最后一个文件;且 cap.release() 和 cv2.destroyAllWindows() 被错误地放在 while 循环内部,造成程序崩溃或窗口残留。
以下是修复后的完整可运行代码:
import os
import cv2
folder_path = r'f:\a' # 注意:Windows路径建议使用原始字符串(r'')或双反斜杠
# 遍历文件夹(含子目录)获取所有.mp4文件
mp4_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith('.mp4'):
mp4_files.append(os.path.join(root, file))
# 按字典序排序(确保 1.mp4, 2.mp4, ... 顺序播放;如需自然排序可引入natsort)
mp4_files.sort()
print(f"共找到 {len(mp4_files)} 个MP4文件,开始顺序播放:")
for video_path in mp4_files:
print(f"▶ 正在播放:{video_path}")
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"⚠ 警告:无法打开视频 {video_path},已跳过")
continue
# 逐帧播放当前视频
while cap.isOpened():
ret, frame = cap.read()
if not ret: # 视频结束或读取失败
break
cv2.imshow('MP4 Player', frame)
# 每帧显示约33ms(约30fps),按'q'键提前退出当前视频
if cv2.waitKey(33) & 0xFF == ord('q'):
break
# ✅ 关键:释放当前视频资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
print("✅ 所有视频播放完毕。")
关键改进说明:
- ✅ 作用域正确:
cv2.VideoCapture、播放循环、release()和destroyAllWindows()均位于for video_path in mp4_files内部,确保每个视频独立完整处理; - ✅ 安全健壮:添加
cap.isOpened()检查,跳过损坏或不支持的文件; - ✅ 格式过滤:使用
file.lower().endswith('.mp4')兼容大小写(如.MP4); - ✅ 有序播放:通过
sort()实现数字命名的自然顺序(若需更精准的自然排序,可安装natsort库); - ✅ 合理延迟:
cv2.waitKey(33)对应约30 FPS,避免画面过快闪退;按'q'可随时中断当前视频进入下一个; - ✅ 资源清理:每个视频播放结束后立即
release()和destroyAllWindows(),防止内存泄漏与窗口堆积。
注意事项:
- 确保已安装 OpenCV:
pip install opencv-python; - 若视频编码不被系统默认解码器支持(如某些H.265文件),可能报错,可尝试用
ffmpeg预转码; -
os.walk()会递归搜索子目录,如只需当前目录,改用os.listdir()+os.path.isfile()更高效; - 生产环境建议增加异常捕获(
try/except),避免单个文件错误中断整个流程。
掌握循环嵌套的作用域与资源生命周期管理,是编写稳定多媒体批处理脚本的基础。










