2017-09-05 10 views
0

[コメント&ダニエルに基づいて編集]このコードを使用して192.168.0.6:8081へのラズベリーパイからのストリーミングビデオ...TypeError: 'str'ではなく、バイトのようなオブジェクトが必要です。これにどのように対処しますか?

import numpy as np 
import cv2 
import socket 


class VideoStreamingTest(object): 
def __init__(self): 

    #self.server_socket = socket.socket() 
    #self.server_socket.bind(('192.168.0.6', 8081)) 
    #self.server_socket.listen(0) 

    #self.connection, self.client_address = self.server_socket.accept() 
    #self.connection = self.connection.makefile('rb') 
    #self.streaming() 
    self.socket = socket.socket() 
    self.connection = self.socket.connect(('192.168.0.6', 8081)) 
    #self.socket.connect(('192.168.0.6', 8081)) 
    self.streaming() 

def streaming(self): 

    try: 
     #print ("Connection from: ", self.client_address) 
     print ("Streaming...") 
     print ("Press 'q' to exit") 

     stream_bytes = b' ' 
     while True: 

      stream_bytes += self.socket.recv(1024) 
      first = stream_bytes.find('\xff\xd8') 
      last = stream_bytes.find('\xff\xd9') 
      if first != -1 and last != -1: 
       jpg = stream_bytes[first:last + 2] 
       stream_bytes = stream_bytes[last + 2:] 
       #image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_GRAYSCALE) 
       image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_UNCHANGED) 
       cv2.imshow('image', image) 

       if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
    finally: 
     #self.connection.close() 
     self.socket.close() 

if __name__ == '__main__': 
    VideoStreamingTest() 

*しかし、私は次のように取得していますエラー:(編集済み):(*

Streaming... 
Press 'q' to exit 
Traceback (most recent call last): 
    File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 48, in <module> 
VideoStreamingTest() 
    File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 19, in __init__ 
self.streaming() 
    File "C:/Users/tiger/Desktop/take_the_stream_from_pi.py", line 32, in streaming 
first = stream_bytes.find('\xff\xd8') 
TypeError: a bytes-like object is required, not 'str' 

私はこれをどのように取り組むのか? PS:このプログラムと私のPCに自分のWebブラウザ上で動作192.168.0.6:8081パイカメラ()からストリーミングされたウィンドウを開くしようとすると)である

+1

あなたのコードから 'self.connection.close()'を削除するだけです。 'socket'オブジェクトはすでに終了を処理します。整数ハンドルを閉じる必要はありません。 –

+0

あなたのインデントは間違っていますが、カット/ペーストや本物のバグが原因であるかどうかはわかりません。 – TuanDT

+0

は 'stream_bytes = b '''(バイト、文字列ではない)を定義します。しかし、回答を無効にするあなたの質問を大きく編集しました。(&コメント) –

答えて

0

connect_exは整数を返し、エラーコードがない場合は0を返します。その呼び出しの結果ではなく、ソケット自体を介して読み込む必要があります。

また、ドキュメントに記載されているように、readメソッドもありません。それはrecvです。

stream_bytes += self.socket.recv(1024) 

また、コメントで述べたように、あなたは同じ理由で、self.connection.closeを呼び出す必要はありません。

+1

さらに、 'connect_ex'はどんな種類の接続オブジェクトも返しません。むしろ、ソケットが接続されているかどうかは、オブジェクトの状態の一部であり、 'connect_ex'が変更されます。 – chepner

+0

OPは彼の質問を再度編集しました。ここで問題は 'stream_bytes = '''であり、 'recv'の出力はバイナリなので' stream_bytes = b '' 'にする必要があります。 –

関連する問題