我想从我的MJPEG流中接收单个帧。为此,我做一些简单的功能来接收此信息。我想为此使用一个http连接。当我调用函数一个时,数据就可以了,但是当我再次调用它时,我得到了不完整的数据。 jpg的开头和结尾是错误的。这是我的功能:
url = "http://127.0.0.1:9000/mjpg"
import requests
s = requests.Session()
r = s.get(url, stream=True)
def _next_frame():
byt = b''
for chunk in r.iter_content(chunk_size=512):
byt += chunk
jpg_start = byt.find(b'\xff\xd8')
jpg_end = byt.find(b'\xff\xd9')
if jpg_start != -1 and jpg_end != -1:
timestamp = byt.find(b'X-Frame-Timestamp')
jpg = byt[jpg_start:jpg_end + 2]
bytes = byt[jpg_end + 2:]
print("Start jpg: ", jpg_start)
print("End jpg: ", jpg_end)
print(len(jpg))
if len(jpg) == 0:
break;
i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
yield i, re.findall("\d+\.\d+", (bytes[timestamp + 19: timestamp + 19 + 20].decode("utf-8")))[0]
当我像这样调用函数时:
next(_next_frame())
一切都很好。样本输出:
Start jpg: 101
End jpg: 37181
当我这样两次调用函数时:
next(_next_frame())
next(_next_frame())
我得到第一帧,但第二帧坏了:
Start jpg: 101
End jpg: 36903
Start jpg: 36822
End jpg: 36719
第二个呼叫中的起始jpg和结束jpg损坏。为什么?如何纠正呢?我需要单帧,因为在我的主程序中,我有一个循环应该得到单帧。