2016-04-08 1 views
5

Я пытаюсь отправить живой видео-кадр с моего клиента (Raspberry Pi) на сервер, размещенный на ноутбуке. Оба этих устройства подключены к одной сети.Отправить видео через TCP с помощью OpenCV и сокетов в Raspberry Pi

Server.py

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

HOST = '192.168.1.3' 
PORT = 8083 

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

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

conn, addr = s.accept() 

data = "" 
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) 
    print frame.size 
    # cv2.imshow('frame', frame) 
    # cv2.waitKey(10) 

Client.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(('192.168.1.3', 8081)) 

while True: 
    ret,frame = cap.read() 
    data = pickle.dumps(frame) 
    clientsocket.sendall(struct.pack("L", len(data)) + data) 

Мой сервер на ноутбуке не получает никаких данных. Но когда я запускаю этот клиент и сервер на одних и тех же устройствах (например, сервер и клиент на ноутбуке), он работает правильно.

Я могу отправить данные с малины на ноутбук (проверено на приложение эхо).

Может ли кто-нибудь помочь мне с этим?

+2

Я не понимаю, почему вы используете TCP для потоковой передачи видео, а не UDP, который предназначен для такого использования. – Humoyun

ответ

1

Согласно моему пониманию, вы должны использовать одни и те же порты для клиента и сервера, но вы используете два разных, 8083 и 8081

Вы проверили, что брандмауэр открыт для порта используется?

+0

Даже когда я ставил свои номера портов одинаково, все равно это та же проблема. И все правила брандмауэра разрешают подключения к этому порту. – Shinchan

+0

Вы проверили, что фактический IP-адрес хост-машины (полученный ipconfig) такой же, как тот, который вы используете в своей программе? Работает ли пинг в обоих направлениях? – tfv

+0

Проблема, которую я получаю, - «payload_size» на сервере получает очень большое значение (7898745431321384897974964), и из-за этого программа находится в бесконечном цикле. – Shinchan

1

После долгих анализов, почему server.py и client.py не работают (даже после того, как брандмауэр был отключен), в файле server.py произошла ошибка: «Слово не должно быть строкой». Следовательно, слово = "" (которое является строкой) должно быть заменено на word = b '' (это две одинарные кавычки для представления байта).

+0

можете ли вы предоставить полный код? Я не вижу «word =» в вашем сервере server.py – TaeWoo