2017-09-05 93 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:试图打开从PI摄像头(这在我的网页浏览器上192.168.0.6:8081作品)流式窗口,我用这个程序PC)

+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 ='''应该是'stream_bytes = b'''因为'recv'的输出是二进制的。 –

相关问题