Отдельный кадр Python Grab из потока MJPEG с подключением http - PullRequest
0 голосов
/ 14 марта 2019

Я хотел бы получить один кадр из моего потока MJPEG. Для этого я делаю простую функцию, которая получает это. Я хочу использовать одно соединение http для этого. Когда я вызываю свою функцию 1, данные в порядке, но когда я вызываю ее снова, я получаю неполные данные. Начало и конец 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 во втором вызове прерваны. Зачем? Как это исправить? Мне нужен один кадр, потому что в моей основной программе у меня есть цикл, который должен получить один кадр.

...