aiaiask.com©

开花即结果 提问即答案

"Python UDP服务端视频流在PyQt5界面中的显示与关闭控制"
原始问题:

"Python UDP服务端视频流在PyQt5界面中的显示与关闭控制"

要在PyQt5中实现UDP服务端视频流的打开与关闭,可以使用以下步骤:

  1. 首先,需要安装PyQt5和OpenCV库。可以使用以下命令安装:
pip install PyQt5 opencv-python
  1. 创建一个名为udp_video_stream.py的文件,然后编写以下代码:
import sys
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt

class UdpVideoStreamThread(QThread):
    change_pixmap_signal = pyqtSignal(np.ndarray)

    def __init__(self, ip, port):
        super().__init__()
        self.ip = ip
        self.port = port
        self.running = True

    def run(self):
        cap = cv2.VideoCapture(f'udp://{self.ip}:{self.port}')
        while self.running:
            ret, frame = cap.read()
            if ret:
                self.change_pixmap_signal.emit(frame)

    def stop(self):
        self.running = False
        self.wait()

class MainWindow(QMainWindow):
    def __init__(self, ip, port):
        super().__init__()

        self.setWindowTitle("UDP Video Stream")
        self.setGeometry(100, 100, 800, 600)

        layout = QVBoxLayout()

        self.label = QLabel(self)
        layout.addWidget(self.label)

        self.start_button = QPushButton("开始", self)
        self.start_button.clicked.connect(self.start_video_stream)
        layout.addWidget(self.start_button)

        self.stop_button = QPushButton("停止", self)
        self.stop_button.clicked.connect(self.stop_video_stream)
        layout.addWidget(self.stop_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

        self.udp_video_stream_thread = UdpVideoStreamThread(ip, port)
        self.udp_video_stream_thread.change_pixmap_signal.connect(self.update_image)

    def start_video_stream(self):
        self.udp_video_stream_thread.start()

    def stop_video_stream(self):
        self.udp_video_stream_thread.stop()

    def update_image(self, cv_img):
        qt_img = self.convert_cv_qt(cv_img)
        self.label.setPixmap(qt_img)

    def convert_cv_qt(self, cv_img):
        rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
        h, w, ch = rgb_image.shape
        bytes_per_line = ch * w
        convert_to_Qt_format = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
        p = convert_to_Qt_format.scaled(800, 600, Qt.KeepAspectRatio)
        return QPixmap.fromImage(p)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ip = "127.0.0.1"
    port = 5000
    mainWin = MainWindow(ip, port)
    mainWin.show()
    sys.exit(app.exec_())
  1. 运行udp_video_stream.py文件,将会看到一个包含视频流的窗口。点击“开始”按钮以开始接收视频流,点击“停止”按钮以停止接收视频流。当视频流关闭时,窗口将显示一个黑色的画布。
"Python UDP服务端视频流在PyQt5界面中的显示与关闭控制"
https://www.aiaiask.com/ask/82864.html
AI / 模型Siliconflow
时间 / DATEMarch 26, 2024, 9:12 AM
语言zh-CN
IP / 区域河南 郑州