2016-11-12 8 views
0
  • がビデオを録画して、ソケットストリームと、別のものに一台のPCからそれを送信します。私はOpenCV ライブラリCV2、NumPyとSocketを使用しています。ソケットストリーム - 私がやろう何のPython(メッセージの一部を切断)

  • 問題:私がフレームを送信すると、私は他のPC上フレームに表示しよう とき、それだけで、その後エラーが出る、全体(921600の43776)の一部を送信します。

サーバー:

#!/usr/bin/python 

import socket 
import cv2 
import numpy as np 

ip = "XXX.XXX.X.XXX" 

def Test(Given_List): 
    y = 0 
    temp = [] 
    Frame_List = [] 

    for kappa in range(480): 
     Frame_List.append([]) 

    for each in Given_List: 

     if len(temp) < 3: 
      temp.append(each) 

     if len(temp) >= 3: 
      Frame_List[y].append(temp) 
      temp = [] 

     if len(Frame_List[y]) >= 640: 
      y += 1 
    return Frame_List 


while True: 
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client_socket.connect((ip,50000)) 
    data = client_socket.recv(10240000) 
    s = np.fromstring(data, dtype=np.uint8) 
    nice = np.asarray(Test(s)) 
    cv2.imshow('frame', nice) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

クライアント:

#!/usr/bin/python 

import socket 
import cv2 

#Receiver ip 
ip = "XXX.XXX.X.XXX" 
port = 50000 

#Set up socket and stuff 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

server.bind(("XXX.XXX.X.XXX", port)) 
server.listen(1) 

#Define the cam stuff 
cap = cv2.VideoCapture(0) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480) 

while(cap.isOpened()): 
    s, add = server.accept() 
    ret, frame = cap.read() 
    n = frame.tobytes() 

    if ret: 
     s.sendall(n) 
    else: 
     break 

# Release everything if job is finished 
cap.release() 
out.release() 
s.close() 
+0

BTW:プログラムが 'listen'と' accept'を使用する場合、クライアントを待つ(そしてデータを提供する)ため、 '' client''ではなく '' server "'と呼びます。 – furas

+0

システム/ソケットは '4096'というサイズのバッファを使うかもしれないので、' recv() 'に' 4096'を使うことを提案しています(ループで受信します)。参照:[socket.recv()](https://docs.python.org/2/library/socket.html#socket.socket.recv) – furas

+0

true:より多くの接続を作成する理由は?サーバーは1つだけを受け入れます。別の質問は、あなたのバッファサイズがどこにあるのか、あなたはデフォルトのbuf_sizeを知っていますか?ソケットはパイプであり、send/recv 'multipart'データ用に別のソケットは必要ありません。 – dsgdfg

答えて

0

データの量は、ソケットの最大量を超えているように思えるので、私はビデオ解像度を変更320x240になり、今は正常に動作します。

関連する問題