Programming/Python

TCP/IP 소켓통신 비디오 프레임[Python]

KayEsQuo 2021. 1. 3. 12:35

지난 글에 이어서 이번에는 영상 속 프레임을 보내보는것에 대해 코드를 작성했고, 사용방법은 다음과 같다.

# Server.py

import pickle
import socket
import struct

import cv2

HOST = 'localhost'
PORT = 8089

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('소켓 생성')

s.bind((HOST, PORT))
s.listen(10)

conn, addr = s.accept()

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

while True:

    # 프레임 사이즈 측정
    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]

    # 메시지 사이즈 기준으로 데이터 구성
    while len(data) < msg_size:
        data += conn.recv(4096)

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

    # 프레임 로드
    frame = pickle.loads(frame_data)

    # 창으로 나타내기
    cv2.imshow('frame', frame)
    cv2.waitKey(1)

 

 

# client.py

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

# 비디오 경로 읽어오기
cap=cv2.VideoCapture("")

clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8089))

while True:
    ret,frame=cap.read()

	# 프레임 직렬화하여 전송준비
    data = pickle.dumps(frame)

    # 메시지 길이 측정
    message_size = struct.pack("L", len(data))

    # 데이터 전송
    clientsocket.sendall(message_size + data)