具有HTTP连接的MJPEG流中的Python Grab单帧

时间:2019-03-14 14:03:19

标签: python http stream mjpeg

我想从我的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损坏。为什么?如何纠正呢?我需要单帧,因为在我的主程序中,我有一个循环应该得到单帧。

0 个答案:

没有答案