Python3 解析网络摄像机 MJPEG HTTP 流实战指南

宋时安
宋时安
发布时间:2026-10-14 | 2人浏览过
原创

本文详解在 Python3 中如何解析网络摄像机的 MJPEG HTTP 视频流。通过识别 JPEG 帧的 0xff 0xd8 和 0xff 0xd9 标记,从 multipart/x-mixed-replace 流中提取二进制数据并解码。针对 OpenCV 直接调用可能出现的“Cam not found”错误,提供了基于 requests 库和流式处理的替代方案,确保视频帧能正确显示。

MJPEG HTTP 流解析原理

前言

网络摄像头通常通过 HTTP 协议以 multipart/x-mixed-replace 格式传输带有边界帧信息的视频流,其中 JPEG 数据以二进制形式直接发送。在实际处理中,无需过度关注 HTTP 协议头部细节,因为所有 JPEG 帧均以十六进制标记 0xff 0xd8 开头,并以 0xff 0xd9 结尾。上述代码逻辑正是利用这一特征,从 HTTP 流中精准提取这些帧,并逐一进行解码处理,具体实现方式如下所示。


...(http)
0xff 0xd8   --|
[jpeg data]   |--this part is extracted and decoded
0xff 0xd9   --|
...(http)
0xff 0xd8   --|
[jpeg data]   |--this part is extracted and decoded
0xff 0xd9   --|
...(http)

若需将图像获取过程从 TCP 网络传输至本地进行解析,必须对接收到的 bytes 类型数据进行相应的解码操作。

在使用 OpenCV 直接调用网络摄像头时,可能会遇到连接或初始化失败的情况。

系统可能报错“Cam not found”。

此时,可以采用以下替代方案来解决该问题。

代码实现与帧解析

具体代码实现如下:\n\n帧解析逻辑


import cv2
cap = cv2.VideoCapture('http://localhost:8080/frame.mjpg')
 
while True:
 ret, frame = cap.read()
 print(frame)
 if ret == True:
  cv2.imshow('Video', frame)
 
  if cv2.waitKey(1) == 27:
   exit(0)

视频流处理总结

视频流解析完整流程


import cv2
import requests
import numpy as np
 
r = requests.get('http://192.168.1.xx/mjpeg.cgi', auth=('user', 'password'), stream=True)
if(r.status_code == 200):
  bytes = bytes()
  for chunk in r.iter_content(chunk_size=1024):
    bytes += chunk
    a = bytes.find(b'\xff\xd8')
    b = bytes.find(b'\xff\xd9')
    if a != -1 and b != -1:
      jpg = bytes[a:b+2]
      bytes = bytes[b+2:]
      i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
      cv2.imshow('i', i)
      if cv2.waitKey(1) == 27:
        exit(0)
else:
  print("Received unexpected status code {}".format(r.status_code))

以上即为 Python3 从网络摄像机解析 MJPEG HTTP 流的详细示例,更多关于 Python 解析 MJPEG HTTP 流的技术资料,欢迎持续关注本站其他相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表