python3从网络摄像机解析mjpeg http流

前言网络摄像头的视频流解析直接使用通过http的Mjpeg是具有边界帧信息的multipart / x-mixed-replace,而jpeg数据只是以二进制形式发送。因此,实际上不需要关心HTTP协议标头。所有jpeg帧均以marker开头,0xff 0xd8并以结尾0xff 0xd9。因此,上面的代码从http流中提取了此类帧,并将其一一解码。像下面...(http)0xff 0x...
摘要由CSDN通过智能技术生成

前言

网络摄像头的视频流解析直接使用通过http的Mjpeg是具有边界帧信息的multipart / x-mixed-replace,而jpeg数据只是以二进制形式发送。因此,实际上不需要关心HTTP协议标头。所有jpeg帧均以marker开头,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

这时候就需要下面这种办法 

代码: 

帧解析

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:
      exi
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Qt中显示从网络接收到的MJPEG图像,可以使用Qt的网络模块QtNetwork中的QTcpSocket类来接收MJPEG数据,并使用QtMultimedia中的QCamera和QCameraViewfinder类来显示图像。下面是一个简单的从网络接收MJPEG图像并显示的示例代码: ```C++ #include <QtWidgets> #include <QtNetwork> #include <QtMultimedia> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个窗口和一个视图 QWidget window; QCameraViewfinder viewfinder(&window); window.setCentralWidget(&viewfinder); window.show(); // 创建一个QCamera对象并设置MJPEG格式 QCamera camera; camera.setCaptureMode(QCamera::CaptureVideo); camera.setViewfinder(&viewfinder); QCameraImageCapture capture(&camera); capture.setCaptureDestination(QCameraImageCapture::CaptureToFile); QCameraViewfinderSettings settings; settings.setPixelFormat(QVideoFrame::Format_MJPEG); camera.setViewfinderSettings(settings); // 创建一个QTcpSocket对象并连接到MJPEG视频 QTcpSocket socket; socket.connectToHost("127.0.0.1", 8080); if(!socket.waitForConnected()){ qDebug() << "Failed to connect to host!"; return -1; } // 接收MJPEG视频并显示图像 QByteArray data; QString boundary = "\r\n--myboundary\r\n"; while(true){ if(socket.bytesAvailable() > 0){ data += socket.readAll(); int pos = 0; while((pos = data.indexOf(boundary, pos)) != -1){ int start = pos + boundary.length(); int end = data.indexOf(boundary, start); if(end == -1) break; QByteArray jpegData = data.mid(start, end - start); QImage image; image.loadFromData(jpegData, "JPEG"); viewfinder.showImage(image); pos = end; } data = data.mid(pos); } } return app.exec(); } ``` 这段代码创建了一个窗口和一个视图,然后创建了一个QCamera对象并设置了MJPEG格式。接着,创建了一个QTcpSocket对象并连接到MJPEG视频。最后,接收MJPEG视频并显示图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一摩尔自由

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值