使用Flask与OpenCV实时读取并网页展示海康摄像头RTSP视频流

Luna
Luna
发布时间:2026-10-12 | 4人浏览过
原创

本文详细介绍如何使用Flask框架结合OpenCV库,通过RTSP协议获取海康摄像头视频数据,并将其转换为JPEG格式实时推送到Web页面。文章涵盖环境配置、核心代码编写、HTML模板对接及常见问题排查,帮助开发者快速搭建局域网视频监控前端。

核心目标与网络准备

利用Flask和OpenCV构建局域网视频流监控页面的核心逻辑是:后端通过RTSP协议拉取摄像头的原始视频帧,逐帧编码为JPEG二进制数据,并使用HTTP的multipart/x-mixed-replace MIME类型实时推送到浏览器;前端仅通过一个<img>标签循环接收流数据即可完成播放。在编写代码前,需确保应用服务器与海康摄像头处于同一局域网,并已开启摄像头的通道设置 → 基本参数 → 码流属性中的RTSP服务。

部署开发环境与依赖

第1步:初始化Python环境并安装依赖包

目的:创建隔离的运行环境并引入必要的图像处理与Web服务组件。操作时建议在项目目录下创建虚拟环境,随后执行命令安装flask、opencv-python、requests与numpy。

pip install flask opencv-python requests numpy

第2步:核对摄像头RTSP连接地址

目的:获取稳定的视频流输入源。海康设备标准RTSP路径通常包含用户名、密码、IP、端口及通道号。默认主码流通道号通常为102(部分老固件使用101)。拼接后的完整地址格式如下:

rtsp://[用户名]:[密码]@[摄像头IP]:[RTSP端口]/Streaming/Channels/101

注意:请将方括号内的占位符替换为实际值,端口默认为554。若摄像头启用了HTTPS或修改了默认端口,需相应调整URL结构。

实现Web端实时视频流展示

第3步:编写Flask后端路由与视频生成器

目的:建立HTTP服务,将OpenCV捕获的frame对象压缩为JPEG字节流,并通过生成器持续yield给客户端。此方法内存占用低且能有效控制延迟。

import cv2
from flask import Flask, render_template, Response

app = Flask(__name__)

# 请在此处替换为你的真实RTSP地址
RTSP_URL = "rtsp://admin:your_password@192.168.1.64:554/Streaming/Channels/101"

def gen_video_stream():
    cap = cv2.VideoCapture(RTSP_URL)
    if not cap.isOpened():
        print("错误:无法打开摄像头RTSP流")
        return
    while True:
        ret, frame = cap.read()
        if not ret:
            print("警告:帧读取失败,等待重连...")
            break
        # 将解码后的BGR帧编码为JPEG格式的二进制数据
        ret, buffer = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 75])
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/video_feed')
def video_feed():
    return Response(gen_video_stream(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

第4步:创建HTML模板文件对接播放接口

目的:提供前端播放容器。Flask默认查找templates目录下的HTML文件,因此需在项目根目录下创建该文件夹,并在其中新建index.html。

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8">
    <title>海康摄像头实时流</title>
    <style>
      body { font-family: system-ui, sans-serif; background: #f5f5f5; padding: 20px; }
      .stream-container { max-width: 800px; margin: 0 auto; background: #fff; padding: 10px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
      img { width: 100%; height: auto; display: block; }
    </style>
  </head>
  <body>
    <div class="stream-container">
      <h2>实时监控画面</h2>
      <img src="{{ url_for('video_feed') }}" alt="RTSP Video Stream">
    </div>
  </body>
</html>

启动服务与完成判断

在终端执行脚本后,控制台会输出访问地址。完成判断标准:浏览器打开http://localhost:5000/或局域网内其他设备的对应IP,页面加载后<img>区域显示连续更新的实时监控画面。此时后端应能持续运行无阻塞,前端无花屏、绿条或长时间缓冲即表示链路打通。

常见问题与排错指南

若接入过程中遇到画面黑屏、白屏或频繁断开连接,请按以下顺序检查:

  1. RTSP服务未启用或鉴权失败:登录设备Web管理界面,确认高级配置 → 通道设置 → 视频 → 码流属性中已勾选“启用主/子码流”及“RTSP”。同时确保URL中密码包含@、#等特殊字符时,需进行URL编码。
  2. 防火墙与安全组拦截:海康摄像头默认监听554端口,Flask服务监听5000端口。需检查服务器iptables、Windows防火墙或云主机安全组策略是否放行双向通信。
  3. 帧率过高导致带宽拥堵:若网络负载大导致卡顿,可在cv2.imencode中降低画质参数(如将IMWRITE_JPEG_QUALITY设为60),或切换至子码流地址(通常通道号为101)。
  4. 长连接稳定性不足:OpenCV底层对RTSP断线自动重连支持有限,代码中已加入基础状态提示。生产环境建议搭配Gunicorn部署静态资源服务器,或引入FFmpeg做中间件转封装以降低延迟。

以上就是使用Flask与OpenCV实时读取并网页展示海康摄像头RTSP视频流的详细内容,更多关于Flask视频流处理与海康威视设备集成的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表