Python 3.x 连接字符串而不是字节

Python 3.x 连接字符串而不是字节,python-3.x,string,byte,Python 3.x,String,Byte,我正在尝试将我的IP摄像头链接到我的a AWS服务,我有两种方法可以做到这一点,一种是使用我的内置计算机摄像头(运行正常),另一种是IP摄像头。我使用的代码来自wich,它是用Python2.7编写的(但我用Python3编写的),我已经将代码转换为Python3(使用Python2to3).但是,当我运行代码时,我不断收到以下错误:仅连接字符串而不是字节: 我是python新手,所以我的研究是2to3将完成大部分工作,但我非常确定将字节转换为字符串的这部分不在其中,我不确定如何处理这种转换/解

我正在尝试将我的IP摄像头链接到我的a AWS服务,我有两种方法可以做到这一点,一种是使用我的内置计算机摄像头(运行正常),另一种是IP摄像头。我使用的代码来自wich,它是用Python2.7编写的(但我用Python3编写的),我已经将代码转换为Python3(使用Python2to3).但是,当我运行代码时,我不断收到以下错误:仅连接字符串而不是字节:

我是python新手,所以我的研究是2to3将完成大部分工作,但我非常确定将字节转换为字符串的这部分不在其中,我不确定如何处理这种转换/解析

Traceback (most recent call last):
  File "video_cap_ipcam.py", line 140, in <module>
    main()
  File "video_cap_ipcam.py", line 104, in main
    bytes += stream.read(16384*2)
TypeError: can only concatenate str (not "bytes") to str
回溯(最近一次呼叫最后一次):
文件“video_cap_ipcam.py”,第140行,在
main()
文件“video_cap_ipcam.py”,第104行,主
字节+=流读取(16384*2)
TypeError:只能将str(而不是“字节”)连接到str
视频\u cap\u ipcam.py文件:

def main():

    ip_cam_url = ''
    capture_rate = default_capture_rate
    argv_len = len(sys.argv)

    if argv_len > 1:
        ip_cam_url = sys.argv[1]

        if argv_len > 2 and sys.argv[2].isdigit():
            capture_rate = int(sys.argv[2])
    else:
        print("usage: video_cap_ipcam.py <ip-cam-url> [capture-rate]")
        return

    print(("Capturing from '{}' at a rate of 1 every {} frames...".format(ip_cam_url, capture_rate)))
    stream = urllib.request.urlopen(ip_cam_url)

    bytes = ''
    pool = Pool(processes=3)

    frame_count = 0
    while True:
        # Capture frame-by-frame
        frame_jpg = ''

        bytes += stream.read(16384*2)
        b = bytes.rfind('\xff\xd9')
        a = bytes.rfind('\xff\xd8', 0, b-1)


        if a != -1 and b != -1:
            #print 'Found JPEG markers. Start {}, End {}'.format(a,b)

            frame_jpg_bytes = bytes[a:b+2]
            bytes = bytes[b+2:]

            if frame_count % capture_rate == 0:


                img_cv2_mat = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
                rotated_img = cv2.transpose(cv2.flip(img_cv2_mat, 0))


                retval, new_frame_jpg_bytes = cv2.imencode(".jpg", rotated_img)

                #Send to Kinesis
                result = pool.apply_async(send_jpg, (bytearray(new_frame_jpg_bytes), frame_count, True, False, False,))

            frame_count += 1

if __name__ == '__main__':
    main()

def main():
ip_cam_url=“”
捕获率=默认捕获率
argv_len=len(sys.argv)
如果argv_len>1:
ip_cam_url=sys.argv[1]
如果argv_len>2且sys.argv[2].isdigit():
捕获率=int(sys.argv[2])
其他:
打印(“用法:video\u cap\u ipcam.py[捕获速率]”)
返回
打印((“以每{}帧1次的速率从{}捕获…”。格式(ip_-cam_-url,捕获率)))
stream=urllib.request.urlopen(ip\u cam\u url)
字节=“”
池=池(进程=3)
帧计数=0
尽管如此:
#逐帧捕获
帧_jpg=“”
字节+=流读取(16384*2)
b=字节.rfind('\xff\xd9')
a=bytes.rfind('\xff\xd8',0,b-1)
如果是-1和b!=-1:
#“打印”找到了JPEG标记。开始{},结束{}。格式(a,b)
frame_jpg_bytes=字节[a:b+2]
字节=字节[b+2:]
如果帧计数%capture\u rate==0:
img_cv2_mat=cv2.imdecode(nparr,cv2.IMREAD_COLOR)
旋转的img=cv2.转置(cv2.翻转(img\u cv2\u mat,0))
retval,new_frame_jpg_bytes=cv2.imencode(“.jpg”,旋转的\u img)
#致动情
结果=pool.apply\u async(发送\u jpg,(字节数组(新的\u帧\u jpg\u字节),帧\u计数,真,假,假)
帧计数+=1
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

当您最初将变量
字节设置为
''
时,该变量将成为字符串,在Python 3中,该字符串被视为字符序列而不是字节序列。(一个字符可以用多个字节表示。)


如果希望
bytes
成为一个字节序列,请将其初始化为
b'
。然后可以将更多的字节连接到它。

当您最初将变量
字节设置为
'
时,该变量将成为字符串,在Python 3中,该字符串被视为字符序列而不是字节序列。(一个字符可以用多个字节表示。)


如果希望
bytes
成为一个字节序列,请将其初始化为
b'
。然后你可以将更多的字节连接到它。

你能详细解释一下吗,我已经将它初始化为“b”,它抛出了一个语法错误
b
'
之间不应该有空格。另外,
'
中的每个“
”之间也不应该有空格,因为它应该是一个空字符串。谢谢,它开始有意义了,但是对于切片表示法,它可能吗
rame\u jpg\u bytes=bytes[a:b+2]
我已经尝试了
frame\u jpg\u bytes=[a:b+2]。encode()
切片表示法适用于字节序列。
[a:b+2]有两个问题。encode()
。第一个是在“
[
”前面缺少变量名,第二个是字节序列没有
编码()
方法。您能详细解释一下吗,我已经将它初始化为“b”,它抛出了一个语法错误
b
'
之间不应该有空格。另外,
'
中的每个“
”之间也不应该有空格,因为它应该是一个空字符串。谢谢,它开始有意义了,但是对于切片表示法,它是可行的吗?
rame\u jpg\u bytes=bytes[a:b+2]
我已经试过了
frame\u jpg\u bytes=[a:b+2]。encode()
切片表示法适用于字节序列。
[a:b+2].encode()有两个问题
。第一个原因是“
[
”前面缺少变量名,第二个原因是字节序列没有
encode()
方法。