需求: 在PyQt5中嵌入视频网络摄像头读取的帧
解决方案一:使用opencv
使用opencv获取网络摄像头(局域网)的frame,然后利用定时器,每隔一定的时间更新画面。
下面为关键代码:
import cv2
self.timer_camera = QTimer() # 初始化定时器
self.cap = cv2.VideoCapture() # 初始化摄像头
self.timer_camera.timeout.connect(self.show_camera) #当计时器到了一定的时间调用show_camera函数
def show_camera(self):
flag, self.image = self.cap.read()
show = cv2.resize(self.image, (600, 350))
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)
self.cameraLabel.setPixmap(QPixmap.fromImage(showImage)) #在Label标签上显示图像
def openCamera(self):
flag = self.cap.open("rtsp url")
if flag == False:
print("请检测相机与电脑是否连接正确")
else:
self.timer_camera.start(30) #设置计时间隔并启动(1000ms == 1s)
def closeCamera(self):
self.timer_camera.stop() #停止计时器
self.cap.release() #释放camera
self.cameraLabel.clear() #清空画面
此方案和获取本地摄像头一样,本地摄像头使用cap = cv2.VideoCapture(0) 类似,在测试过程中获取本地摄像头可以,但是获取rtsp流的网络摄像头不可以。然后使用vlc软件可以使用那个rtsp地址播放摄像头视频,不知道是哪里的问题(可能是摄像头本身的畏问题)。。。。。。。因此又考虑了第二种方案。
解决方案二:使用vlc
参考
安装vlc
python -m pip install python-vlc
if args:
self.instance = vlc.Instance(*args)
self.mediaplayer = self.instance.media_player_new()
else:
self.mediaplayer = vlc.MediaPlayer()
if platform.system() == "Windows":
self.mediaplayer.set_hwnd(self.cameraLabel.winId()) #在cameraLabel显示帧
def openCamera(self):
url = "rtsp url"
self.mediaplayer.set_mrl(url)
self.mediaplayer.play()
def closeCamera(self):
self.mediaplayer.stop()
self.mediaplayer.release()