求助:如何通过PyQt5/PyQt6 QtMultimedia实现IP摄像头视频流播放?
如何用PyQt5/PyQt6的QtMultimedia播放D-Link DCS-931L IP摄像头的视频流?
我需要实现5台D-Link DCS-931L IP摄像头的视频流并行播放,最初用OpenCV实现时5路流同时播放帧率过低,因此改用PyQt的QtMultimedia框架来提升性能,摄像头通过TP-Link路由器接入局域网。
我已经尝试了以下几种方案,但均未成功:
方案1:使用QCamera类连接
尝试用QCamera和QCameraInfo访问摄像头,但该方法只能识别本地笔记本摄像头,无法连接IP摄像头。代码如下:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QMainWindow, QMessageBox, QPushButton from PyQt5.QtMultimedia import QCamera, QCameraInfo from PyQt5.QtMultimediaWidgets import QCameraViewfinder from PyQt5.QtCore import QUrl class DualCameraApp(QWidget): def __init__(self): super().__init__() self.setWindowTitle('Dual Camera App') self.setGeometry(100, 100, 800, 600) self.camera1 = QCamera(QCameraInfo.defaultCamera()) #self.camera2 = QCamera(QCameraInfo.availableCameras()[1]) self.viewfinder1 = QCameraViewfinder() #self.viewfinder2 = QCameraViewfinder() self.camera1.setViewfinder(self.viewfinder1) #self.camera2.setViewfinder(self.viewfinder2) self.camera1.start() #self.camera2.start() layout = QVBoxLayout() layout.addWidget(self.viewfinder1) #layout.addWidget(self.viewfinder2) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) window = DualCameraApp() window.show() sys.exit(app.exec_())
方案2:PyQt5下用QMediaPlayer通过HTTP流地址连接
获取到摄像头的HTTP流地址后,改用QMediaPlayer和QVideoWidget尝试播放,但运行后仅显示空窗口,没有视频流输出。代码如下:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QCamera from PyQt5.QtMultimediaWidgets import QVideoWidget from PyQt5.QtCore import QUrl class VideoPlayer(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("IP Camera Video Stream") self.setGeometry(100, 100, 800, 600) video_widget = QVideoWidget() layout = QVBoxLayout() layout.addWidget(video_widget) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) self.media_player = QMediaPlayer(self, QMediaPlayer.VideoSurface) self.media_player.setVideoOutput(video_widget) # http://IP/h264.flv - with sound? url = "http://admin:admin1@192.168.1.141/video.cgi" self.media_content = QMediaContent(QUrl(url)) self.media_player.setMedia(self.media_content) self.media_player.play() if __name__ == '__main__': app = QApplication(sys.argv) player = VideoPlayer() player.show() sys.exit(app.exec_())
方案3:改用PyQt6+RTSP流地址连接
换成PyQt6框架并使用RTSP地址尝试,结果仍然无法播放视频流,代码如下:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt6.QtMultimedia import QMediaPlayer from PyQt6.QtMultimediaWidgets import QVideoWidget from PyQt6.QtCore import QUrl class VideoPlayer(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("IP Camera Video Stream") self.setGeometry(100, 100, 800, 600) video_widget = QVideoWidget() layout = QVBoxLayout() layout.addWidget(video_widget) self.container = QWidget() self.container.setLayout(layout) self.setCentralWidget(self.container) url = "rtsp://admin:admin1@192.168.1.157/play1.sdp" self.media_player = QMediaPlayer(self) self.media_player.setSource(QUrl(url)) self.video_widget = QVideoWidget() self.media_player.setVideoOutput(self.video_widget) # self.video_widget.show() self.media_player.play() if __name__ == '__main__': app = QApplication(sys.argv) player = VideoPlayer() player.show() sys.exit(app.exec())
请问如何解决这个问题,让QtMultimedia能够正常播放D-Link DCS-931L的IP摄像头视频流?
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

