2016-04-08 10 views
5

私はクライアント(ラズベリーパイ)からラップトップでホストされているサーバーにライブビデオフレームを送信しようとしています。これらのデバイスは両方とも同じネットワークに接続されています。ラップトップ上のOpenCVとRaspberry Piのソケットを使用してビデオ送信TCP

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

UDPの代わりにビデオストリーミングのためにTCPを使用している理由を理解できません。このような用途に使用することを意図しています。 – Humoyun

答えて

1

私の理解によると、あなたは、クライアントとサーバーに同じポートを使用する必要がありますが、次の2つの異なるものを、8083および8081

は、ファイアウォールがポートのために開かれ使用されていることを確認しましたを使用していますか?

+0

ポート番号を同じにしても、同じ問題です。また、すべてのファイアウォールルールはそのポートで接続を許可します。 – Shinchan

+0

あなたのホストマシンの実際のIP(ipconfigによって得られたもの)があなたのプログラムで使用しているものと同じであることを確認しましたか?両方向でpingが動作しますか? – tfv

+0

問題サーバーで "payload_size"が非常に大きな値(7898745431321384897974964)を取得していて、プログラムが無限ループになっています。 – Shinchan

1

(なぜなら、ファイアウォールが無効になった後でも)server.pyとclient.pyが動作しなかった理由は、server.pyコードにエラーがあります。「単語は文字列ではありません。したがって、word = ""(文字列)はword = b "'に変更する必要があります(これらは1バイトを表す2つの単一引用符です)。

+0

あなたは完全なコードを共有できますか?私はあなたのserver.pyコードで "word ="を見ない – TaeWoo