Python optymalny przesył video - OpenCV klient-server

0

Cześć,

Potrzebowałbym wsparcia w temacie przesyłu video z jednego komputera na drugi.
Do obsługi kamery użyłem Open CV, formatka - wyświetlanie - PyQt.

Może to śmieszne ale udało mi się zrobić 'streaming video' na protocole TCP, ... tak wiem, wstyd.
Jednak chciałbym użyć UDP/RTP, jednak wciąż borykam się z problemem przesyłu pakietu .

Kod działający - TCP.
Wady:

  • protokół połączeniowy
  • wolny

Zalety:

  • działa

[KLIENT]

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

def StartStreamSending():
    u"""
    Funkcja przesyłająca stream z lokalnej kamery[0] na serwer.
    Testowo: 'localhost'. Port: 8089
    """
    cap=cv2.VideoCapture(0)
    clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    clientsocket.connect(('localhost',8089))
    while True:
        ret,frame=cap.read()
        data = pickle.dumps(frame)
        clientsocket.sendall(struct.pack("L", len(data))+data)

StartStreamSending()

[SERVER]

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

HOST='localhost'
PORT=8089

def WaitAndReceiveVideoStream(_strHOST, _iPORT):
    u"""
    Funkcja odbierająca stream z kamery klienta.
    Testowo: 'localhost'. Port: 4096
    """
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print 'Socket created'

    s.bind((_strHOST,_iPORT))
    print 'Socket bind complete'
    s.listen(10)
    print 'Socket now listening'

    conn,addr=s.accept()

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

    i = 0
    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)

        #print 'coming frame' 
        cv2.imshow('frame',frame) 
        cv2.waitKey(4) #Important delay - for test try 2 or 4 value.

WaitAndReceiveVideoStream(HOST, PORT)

W jaki prawidłowy sposób powinienem przesyłać klatki obrazu przez sieć ?

Mógłby ktoś zarzucić przykładem ?

0

Myślałem o vlc ale też nie rozkminialem tematu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1