海康网络摄像头配置 Python + HTML 显示 rtsp
买的这个摄像头,应该不是海康本家的,但协议通用
https://item.taobao.com/item.htm?_u=b2020hgjkb441f&id=635662827249
上来先把电源线剪了改安德森口,正极剪开后有两根线,粗的那个是夜视的红外 LED 灯的供电,细的是摄像头本身的,可以把两根线搓到一起都接到 12V 上
通电后刚开始不知道摄像头 IP,也没有说明书啥的
后来发现可以用海康的 SADP 软件找到局域网中的所有摄像头
软件下载在这里 https://www.hikvision.com/cn/download_more_393.html
摄像头通电后应该会有咔嚓的一声,是摄像头模组的光学滤镜初始化的声音,网线接到局域网中用 SADP 搜索就能找到摄像头,改成局域网下的 IP 地址
最新版 Chrome 访问会提示不支持,只能用 IE 来访问,是个特别老旧的页面,但能看到图像
摄像头使用的是 rtsp 视频串流,地址格式如下:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
username: 用户名,初始admin。
password: 密码,初始admin。
ip: 为设备IP,例如 192.168.1.103。
port: 端口号,初始/默认554,若为默认可不填写。
codec:h264、MPEG-4、mpeg4
channel: 通道号,起始为1。例如通道1,则为ch1。
subtype: 码流类型,主码流为main,辅码流为sub(主码流清晰用于本地,子码流用于网络传输)。
For example:
rtsp://admin:admin@192.168.1.103:554/h264/ch1/main/av_stream
(https://blog.csdn.net/patrick_starrr/article/details/93858412)
用 VLC 软件,在媒体 -> 网络流媒体下面输入 rtsp 的地址就可以看到画面
下面是用 Python 显示,
import cv2
url = "rtsp://admin:admin@192.168.1.37:554/h264/ch1/main/av_stream"
vcap = cv2.VideoCapture(url)
while(1):
ret, frame = vcap.read()
cv2.imshow('VIDEO', frame)
cv2.waitKey(1)
就可以用 opencv 读到画面
接下来用 Flask 串流画面到浏览器上,用的网上的案例程序,语法比较神奇:
(https://medium.datadriveninvestor.com/video-streaming-using-flask-and-opencv-c464bf8473d6)
import cv2
class VideoCamera(object):
url = "rtsp://admin:admin@192.168.1.37:554/h264/ch1/main/av_stream"
def __init__(self):
#capturing video
self.video = cv2.VideoCapture(self.url)
def __del__(self):
#releasing camera
self.video.release()
def get_frame(self):
#extracting frames
ret, frame = self.video.read()
# encode OpenCV raw frame to jpg and displaying it
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()
#!/usr/bin/env python
from flask import Flask, render_template, Response, url_for
app = Flask(__name__)
@app.route('/')
def index():
return '''<html>
<head>
<title>Video Streaming Demonstration</title>
</head>
<body>
<h1>Video Streaming Demonstration</h1>
<img src="'''+url_for('video_feed')+'''">
</body>
</html>
'''
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)