python摄像头推流_海康视频实时推流学习笔记

学习目的是在Python里调取网络摄像头实时显示视频流,方便日后处理。

我最开始的想法是用萤石开发平台下载的sdk自带的demo,在Python里调用C++的程序,但是在运行的过程中返回错误,NET-DVR-LOGIN-V30 failed error code=7,排查了很久未能解决,发现了一种新的方法,通过用Python直接调用网络摄像头的rtsp通信协议更为简单,便进行Python编程。

开发环境:Ubuntu 14.0 OpenCV3.2 TensorFlow1.4 Python3.5.2

IDE 用了pycharm

再此之前先初步熟悉了Linux操作系统的基本指令,然后进行编程:首先是摄像头连接,再此需要输入摄像头所分配到的IP地址,设备用户名和密码,然后代码运行后显示摄像头连接成功,然后就是视频流的调取,写了一个cam_read的代码,如下:

# coding=utf-8

import cv2

from Configuration.config import * # 引入配置文件包

from Network.cam_link import cam_link

link = cam_link()

while(True): # 等待摄像头连接

print("未检测到摄像头,请检查设备连接!")

link = cam_link()

if link == 0:

break

source = get_rtsp()

cam = cv2.VideoCapture(source)

while (True):

# get a frame

ret, frame = cam.read()

# show a frame

cv2.imshow("window", frame)

if cv2.waitKey(1) & 0xff == ord('q'):

break

# 释放摄像头对象和窗口

cam.release()

cv2.destroyAllWindows()

这个代码也没有问题,运行后出现:

cv2.error: OpenCV(4.0.0) /io/opencv/modules/highgui/src/window.cpp:350: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

我查阅了大量的资料,最后发现代码是没有问题的,摄像头与计算机的通信也是没有问题的,为了解决这个问题,我试图在代码里添加sleep,因为我以为是摄像头延时太长导致的无法释放,所以添加了延时函数:

Import time

Cam=cv2.videCapture(0)

Time.sleep(1)

Ret,frame=cam.read()

但并没有解决,后来又以为OpenCV的版本不对,尝试用Python调取本地计算机的摄像头,成功了,所以并不是版本问题。最后解释为在释放视频流的时候摄像头的内容并没有通过window显示。经过了几天的查资料,记录,学习,我发现此摄像头并不支持rtsp通信协议,我做的所有都是基于支持rtsp协议的条件下进行的,然后我开始查这种摄像头所支持的协议,得出的结论是,只支持rtmp和其开放平台所研发的萤石私密协议,首先,rtmp是基于tcp的协议,服务端发送给客户端的数据需要flash解析,其他客户端解析不了,私密协议也是类似。

所以最后的结果只能是在web中进行预览和截图,把图片路径复制到Python里进行处理,或者用支持rtsp协议的设备进行。

你可能感兴趣的:(python摄像头推流)