0

0

如何使用 Streamlit 与 OpenCV 实现双视频并行播放

霞舞

霞舞

发布时间:2026-03-07 12:09:01

|

793人浏览过

|

来源于php中文网

原创

如何使用 Streamlit 与 OpenCV 实现双视频并行播放

本文详解如何在 streamlit 应用中稳定、高效地同步播放两个本地视频(如用于计算机视觉对比分析),解决原始循环阻塞、帧不同步及通道错误等常见问题,并提供可直接运行的健壮实现方案。

本文详解如何在 streamlit 应用中稳定、高效地同步播放两个本地视频(如用于计算机视觉对比分析),解决原始循环阻塞、帧不同步及通道错误等常见问题,并提供可直接运行的健壮实现方案。

在基于 Streamlit 构建计算机视觉演示应用时,常需并排展示处理前/后视频、多路摄像头流或算法效果对比。但初学者易陷入“无限 while True 循环导致 UI 卡死”“单个 VideoCapture 错误复用”“BGR→RGB 转换遗漏导致色彩失真”等典型陷阱。以下是一个生产就绪(production-ready)的双视频并行播放实现,兼顾稳定性、同步性与可维护性。

android rtsp流媒体播放介绍 中文WORD版
android rtsp流媒体播放介绍 中文WORD版

本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

✅ 核心设计原则

  • 避免阻塞主线程:Streamlit 的脚本执行是单次、顺序式的;while True 会永久阻塞,使页面无法响应交互。正确做法是利用 st.empty() 占位符 + 显式循环控制。
  • 独立视频源管理:为每个视频创建独立 cv2.VideoCapture 实例,防止帧读取冲突。
  • 统一色彩空间处理:OpenCV 默认输出 BGR,而 Streamlit 的 st.image() 期望 RGB 或默认通道顺序;必须显式转换(cv2.cvtColor(..., cv2.COLOR_BGR2RGB))。
  • 优雅终止逻辑:以 cap.isOpened() 和 ret 双重判断确保任一视频结束时安全退出,避免 None 帧引发异常。

✅ 完整可运行代码

import streamlit as st
import cv2

# 页面配置(建议始终置于顶部)
st.set_page_config(
    page_title="双视频对比演示",
    layout="wide",  # 更好适配并排布局
)

st.title("? 双视频并行播放(OpenCV + Streamlit)")

# 创建左右两列布局
col1, col2 = st.columns(2)

# 初始化两个空占位符(关键!替代直接 .image())
video_placeholder_1 = col1.empty()
video_placeholder_2 = col2.empty()

# 加载两个独立视频源(请确保路径存在)
cap1 = cv2.VideoCapture("videos/cars.mp4")
cap2 = cv2.VideoCapture("videos/motorbikes-1.mp4")

# 验证视频是否成功打开
if not cap1.isOpened() or not cap2.isOpened():
    st.error("❌ 无法打开一个或多个视频文件,请检查路径和格式。")
    st.stop()

# 主播放循环:只要至少一个视频仍在打开状态即继续
while cap1.isOpened() and cap2.isOpened():
    # 分别读取帧
    ret1, frame1 = cap1.read()
    ret2, frame2 = cap2.read()

    # 若任一视频读取失败(到结尾或出错),退出循环
    if not ret1 or not ret2:
        break

    # 关键:BGR → RGB 转换(否则颜色异常)
    frame1_rgb = cv2.cvtColor(frame1, cv2.COLOR_BGR2RGB)
    frame2_rgb = cv2.cvtColor(frame2, cv2.COLOR_BGR2RGB)

    # 更新占位符内容(自动刷新,无闪烁)
    video_placeholder_1.image(frame1_rgb, channels="RGB", use_column_width=True, caption="视频 1:车辆检测")
    video_placeholder_2.image(frame2_rgb, channels="RGB", use_column_width=True, caption="视频 2:摩托车识别")

# 清理资源(务必调用)
cap1.release()
cap2.release()
cv2.destroyAllWindows()

st.success("✅ 视频播放完成。所有资源已释放。")

⚠️ 注意事项与进阶建议

  • 路径与格式:确保 videos/ 目录存在于当前工作目录,且视频为 .mp4(推荐 H.264 编码)或 .avi 等 OpenCV 支持格式;避免使用网络流(如 RTSP)除非额外配置解码器。
  • 性能优化
    • 如视频分辨率过高,可在 cv2.resize() 后再显示(例如 frame1 = cv2.resize(frame1, (640, 480)));
    • 添加 time.sleep(0.03)(≈33 FPS)可降低 CPU 占用,但非必需(Streamlit 自动限帧率)。
  • 错误恢复:生产环境建议包裹 try/except 捕获 cv2.error,并提供重试按钮。
  • 扩展性:轻松扩展为 2×2 网格——只需增加 st.columns(4) 和对应 cap/placeholder 变量即可。

该方案已在 Streamlit 1.30+ 与 OpenCV 4.9+ 环境验证通过,无阻塞、无色彩异常、资源释放完整,是构建 CV 教学演示、模型效果对比界面的可靠基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

451

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2023.10.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

489

2023.08.14

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

111

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

99

2025.11.13

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号