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()
BTW:プログラムが 'listen'と' accept'を使用する場合、クライアントを待つ(そしてデータを提供する)ため、 '' client''ではなく '' server "'と呼びます。 – furas
システム/ソケットは '4096'というサイズのバッファを使うかもしれないので、' recv() 'に' 4096'を使うことを提案しています(ループで受信します)。参照:[socket.recv()](https://docs.python.org/2/library/socket.html#socket.socket.recv) – furas
true:より多くの接続を作成する理由は?サーバーは1つだけを受け入れます。別の質問は、あなたのバッファサイズがどこにあるのか、あなたはデフォルトのbuf_sizeを知っていますか?ソケットはパイプであり、send/recv 'multipart'データ用に別のソケットは必要ありません。 – dsgdfg