【问题标题】:TypeError: must be str, not bytes , Python 3, Raspberry piTypeError: must be str, not bytes , Python 3, Raspberry pi
【发布时间】:2018-04-04 09:38:26
【问题描述】:

我正在尝试通过笔记本电脑将视频从树莓派发送到我的笔记本电脑 并将它们保存为图片,所以我在网上找到了以下代码 但是当我运行它们时出现以下错误 所以我使用预加载的 Thonny ide 在 pi 上运行这个客户端代码 ,对于下面的代码格式,我深表歉意,如果有人能帮我解决这个问题,我将不胜感激

笔记本电脑上的服务器使用 python 3.6 idle 运行

import sys
import numpy as np
import cv2
import socket


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

    self.server_socket = socket.socket()
    self.server_socket.bind(('0.0.0.0', 9006))
    self.server_socket.listen(0)
    self.connection, self.client_address = self.server_socket.accept()
    self.connection = self.connection.makefile('rb')
    self.streaming()

def streaming(self):

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

        stream_bytes = ' '
        while True:

            stream_bytes += self.connection.read(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.server_socket.close()

if __name__ == '__main__':
VideoStreamingTest()

我收到以下错误

 Connection from:  ('192.168.43.3', 47518)
 Streaming...
 Press 'q' to exit
 Traceback (most recent call last):
 File "C:\Users\John Doe\d-ff\Desktop\AutoRCCar-master 
 3\test\stream_server_test.py", line 46, in <module>
 VideoStreamingTest()
 File "C:\Users\John Doe\d-ff\Desktop\AutoRCCar-master  
 3\test\stream_server_test.py", line 16, in __init__
 self.streaming()
 File "C:\Users\John Doe\d-ff\Desktop\AutoRCCar-master 
 3\test\stream_server_test.py", line 28, in streaming
 stream_bytes += self.connection.read(1024)
 TypeError: must be str, not bytes

pi 上的客户端

     import io
     import socket
     import struct
     import time
     import picamera

    # create socket and bind host
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('ToM', 9006))
    connection = client_socket.makefile('wb')

   try:
    with picamera.PiCamera() as camera:
    camera.resolution = (320, 240)      # pi camera resolution
    camera.framerate = 5               # 10 frames/sec
    time.sleep(2)                       # give 2 secs for camera to initilize
    start = time.time()
    stream = io.BytesIO()

    # send jpeg format video stream
    for foo in camera.capture_continuous(stream, 'jpeg', use_video_port = True):
        connection.write(struct.pack('<L', stream.tell()))
        connection.flush()
        stream.seek(0)
        connection.write(stream.read())
        if time.time() - start > 600:
            break
        stream.seek(0)
        stream.truncate()
connection.write(struct.pack('<L', 0))
finally:
connection.close()
client_socket.close()

我收到以下错误

 During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/Desktop/stream_client.py", line 40, in <module>
connection.close()
File "/usr/lib/python3.5/socket.py", line 594, in write
return self._sock.send(b)
BrokenPipeError: [Errno 32] Broken pipe

我首先认为这可能是因为我在 pi 上通过 wifi 运行 vnc 查看器(远程桌面)时带宽有限,但我认为不是

【问题讨论】:

    标签: sockets raspberry-pi python-3.6 raspberry-pi3


    【解决方案1】:

    我也有同样的问题。经过一番搜索,我找到了解决方案。 在 python 3 中,我们必须指定字符串是常规字符串还是二进制字符串。这就是为什么我们使用 b'string' 而不仅仅是 'string'

    改变

    stream_bytes = ' '

    stream_bytes = b' '

    也改变

    first = stream_bytes.find('\xff\xd8') last = stream_bytes.find('\xff\xd9')

    first = stream_bytes.find(b'\xff\xd8') last = stream_bytes.find(b'\xff\xd9')

    请注意,您使用的是 cv2.CV_LOAD_IMAGE_UNCHANGED,它在 opencv3.0 中不可用 使用 cv2.IMREAD_COLOR 以彩色显示图像。

    编辑这些更改,您的直播应该可以顺利运行。

    【讨论】:

      【解决方案2】:
      connection.write(struct.pack('<L', 0))
      

      通过在 try 中插入上面的内容来检查

      【讨论】:

        猜你喜欢
        • 2014-03-08
        • 2019-05-10
        • 1970-01-01
        • 2012-12-04
        • 2020-05-29
        • 1970-01-01
        • 2018-12-23
        相关资源
        最近更新 更多