首页 > 解决方案 > 用于 ive 流的套接字和 Cv2。Python [解释]

问题描述

基本上,我从该站点的一个直播问题中复制了代码。代码是:Server.py

import pickle
import socket
import struct

import cv2

HOST = ''
PORT = 8080

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')

s.bind((HOST, PORT))
print('Socket bind complete')
s.listen()
print('Socket now listening')

conn, addr = s.accept()

data = b''
payload_size = struct.calcsize("L")

while True:

    # Retrieve message size
    while len(data) < payload_size:
        data += conn.recv(4096)

    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED

    # Retrieve all data based on message size

    while len(data) < msg_size:
        data += conn.recv(4096)

    frame_data = data[:msg_size]
    data = data[msg_size:]

    # Extract frame
    frame = pickle.loads(frame_data)
    # Display
    cv2.imshow('frame', frame)
    cv2.waitKey(1)

    if 0xFF == ord('d'):
        break

客户端.py

import cv2
import numpy as np
import socket
import sys
import pickle
import struct

cap=cv2.VideoCapture(0)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8080))

while True:
    ret,frame=cap.read()
    # Serialize frame
    data = pickle.dumps(frame)
    # Send message length first
    message_size = struct.pack("L", len(data))

    # Then data
    clientsocket.sendall(message_size + data)

问题

为什么我们在 client.py 中发送数据长度和帧数据?

server.py 的主 while 循环中发生了什么

在 server.py 的 while 循环中,我们必须使用其他 while 循环。recv来自客户的数据。

为什么我们不能直接从客户端接收腌制框架并取消它。

为什么我们需要data.

并且套接字一次或一个发送所有数据

即使问题看起来太蹩脚也请回答..

标签: pythonopencvsocketslive-streaming

解决方案


推荐阅读