You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过PyQt5/PyQt6 QtMultimedia实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:27:43