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