QT获取ESP32-CAM视频流分析

这篇具有很好参考价值的文章主要介绍了QT获取ESP32-CAM视频流分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT获取ESP32-CAM视频流分析

1、前言

      使用QT获取ESP32-CAM视频流的原理是在QT模拟浏览器发送http请求,然后ESP32-CAM返回视频流,当QT界面接收到数据后,对数据进行解析,然后合成图片进行显示。
      在QT中发送http请求的方法很多,这里使用Qt网络模块中的类QNetworkReply发送http请求。

2、核心代码以及数据分析

      ①下面是QT的一个构造函数,当程序跑起来后,首先跑这部分代码,在这里模拟发送hhtp请求。其中ESP32-CAM分配到的IP地址是192.168.1.8.

#include <QHostAddress>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QQueue>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkRequest request(QUrl("http://192.168.1.8"));

    QNetworkReply *reply= manager->get(request);

    connect(reply, &QNetworkReply::finished, [reply]() {
        if (reply->error())
        {
            qDebug() << "Error:" << reply->errorString();
        }
        else
        {
            qDebug() << "Success:" << reply->readAll();
        }
        reply->deleteLater();
    });
}

这部分代码运行成功后,应该有如下打印:
QT获取ESP32-CAM视频流分析
上面就是返回一个网页,当你把http://192.168.1.8复制到网页去搜索,会返回下面的页面:
QT获取ESP32-CAM视频流分析

      ②下面是进行视频流http请求代码,调用它,运行后可以打印接收到的原始数据。注意视频流使用的是81端口。

void MainWindow::start()
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkRequest request;
    request.setUrl(QUrl("http://192.168.1.8:81/stream"));
    request.setRawHeader("Connection", "Keep-Alive");
    request.setRawHeader("User-Agent", "1601");

    Client = manager->get(request);  //Client为QNetworkReply类型,在MainWindow类里面定义

    connect(Client, &QNetworkReply::readyRead, this, &MainWindow::dataReceived);

}
void MainWindow::dataReceived()
{
    // 打印接收内容
    QByteArray buffer = Client->readAll();
    qDebug() << buffer;
    qDebug() << "----------------------";
}

接收到的原始数据如下:
QT获取ESP32-CAM视频流分析
      上面接收到的原始数据是不能直接用的。就是每次一次接收到的数据并不是一帧完整的数据。因此需要把每次接收到的数据存储起来,然后进行切割。切割的思路是:先这样这样,然后再这样这样。

      在完成数据的存储和切割后,得到如下一帧一帧完整的数据。(在下面的数据中,每一帧数据只打印了前100个字节和后100个字节)。每一帧数据以“Content-Type: image/jpeg\r\nContent-Length: 28912\r\n\r\n\”开头,以“\r\n–123456789000000000000987654321\r\n”结束,中间部分的数据就是图片数据,图片数据的长度是Content-Length后面的数字(28912)。把中间部分数据提取出来即可合成图片。
QT获取ESP32-CAM视频流分析
      切割数据的思路是:每次接收到原始数据,都要判断一下是否包含字符串“Content-Type”,如不包含,则当前接收的数据归为上一帧数据,若包含,则在当前接收到的数据里面,将Content-Type前面部分的数据归为上一帧数据,而以Content-Type开始的后半部分数据归为下一帧数据。(其实就是将两帧黏起来的数据进行切割)。

      ③合成图片的关键代码

void MainWindow::dataProcess( )
{
    QString data = QString::fromUtf8(frameBuffer.data(), 50); //截取前面50个字符

//    qDebug() <<frameBuffer.left(100)<<"......";
//    qDebug() <<frameBuffer.right(100);
//    qDebug() <<"------------------------";

    const QString lengthKeyword = "Content-Length: ";

    int lengthIndex = data.indexOf(lengthKeyword);
    if (lengthIndex >= 0) {
        int endIndex = data.indexOf("\r\n", lengthIndex);
        int length = data.midRef(lengthIndex + 16, endIndex - (lengthIndex + 16 - 1)).toInt(); //取出Content-Length后的数字
        QPixmap pixmap;
        auto loadStatus = pixmap.loadFromData(frameBuffer.mid(endIndex + 4, length)); //取出图片数据,并合成图片

        if (!loadStatus) {
            qDebug() << "Video load failed";
            frameBuffer.clear();
            return;
        }

        frameBuffer.clear();
        QPixmap pps = pixmap.scaled(ui->label_display->width(), ui->label_display->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
        ui->label_display->setPixmap(pps);
    }
}

3、图片合成效果

跟网页效果差不多,很流畅。
QT获取ESP32-CAM视频流分析

4、源码

ESP32CAM.exe
https://www.aliyundrive.com/s/CwhgTsmggwG
提取码: 9ek4
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

5、结束

加油,打工人。文章来源地址https://www.toymoban.com/news/detail-419262.html

到了这里,关于QT获取ESP32-CAM视频流分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 如何用java获取视频流处理

           可以使用JavaCV库,它是OpenCV在Java中的接口,并且提供了访问视频流的功能。 以下是JavaCV获取视频流并处理帧的一个简单示例:       这个示例代码中,我们使用FFmpegFrameGrabber类从rtsp视频URL中抓取每一帧。在while循环中,我们可以处理每一帧的Mat对象并执行必要的逻

    2024年02月12日
    浏览(5)
  • ffmpeg从摄像头获取视频流

    使用FFmpeg获取本地摄像头设备 ffmpeg -list_devices true -f dshow -i dummy ffmpeg -f dshow -i video=\\\"e2eSoft iVCam\\\" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test ffmpeg -f dshow -i video=\\\"OBS Virtual Camera\\\" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp

    2024年02月11日
    浏览(46)
  • QT实现OpenCV播放rtsp视频流

    QT实现OpenCV播放rtsp视频流

    使用OpenCV(图像处理)、FastDeploy(飞桨部署)库; 监控相机传输数据用的是码流,高清网络摄像机产品编码器都会产生两个编码格式,称为 主码流 和 子码流 。这就叫双码流技术。 目的是用于解决监控录像的本地存储和网络传输的图像的质量问题。双码流能实现本地和远程

    2024年02月03日
    浏览(38)
  • OpenCV获取网络摄像头实时视频流

    参考文章: [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头 [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头_落痕的寒假的博客-CSDN博客 在使用OpenCv处理视频时,无论是视频文件还是摄像头画面,都要使用VideoCapture类来进行每一帧图像的处理。当我们

    2024年02月01日
    浏览(42)
  • 利用ffmpeg分析视频流

    ffprobe -show_packets -i \\\"rtsp://192.168.61.46:8554/live?channel=0type=0\\\":该命令用于显示 RTSP 流中的数据包信息,例如时间戳、大小、持续时间等。 ffprobe -i \\\"rtsp://192.168.61.46:8554/live?channel=0type=0\\\":该命令用于显示输入 RTSP 流的基本信息,例如时长、编解码器、分辨率等。 ffprobe -show_format -

    2024年02月13日
    浏览(8)
  • Qt推流程序自动生成网页远程查看实时视频流(视频文件/视频流/摄像头/桌面转成流媒体rtmp+hls+webrtc)

    Qt推流程序自动生成网页远程查看实时视频流(视频文件/视频流/摄像头/桌面转成流媒体rtmp+hls+webrtc)

    推流程序将视频流推送到流媒体服务器后,此时就等待验证拉流播放,一般可以选择ffplay命令行播放或者vlc等播放器打开播放,也可以选择网页直接打开拉流地址播放,一般主流的浏览器都支持网页直接播放hls/m3u8/webrtc类型的视频流,而且推流的主要目的可能就是为了能够在

    2024年02月05日
    浏览(44)
  • 安防视频管理平台GB设备接入EasyCVR, 如何获取RTMP与RTSP视频流

    安防视频管理平台GB设备接入EasyCVR, 如何获取RTMP与RTSP视频流

    安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,比如:视频监控直播、云端录像、云存储、录

    2024年02月15日
    浏览(13)
  • VS+QT+Opencv使用YOLOv4对视频流进行目标检测

    对单张图像的检测,请参考:https://blog.csdn.net/qq_45445740/article/details/109659938

    2024年02月12日
    浏览(36)
  • 树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流

    目录 前提步骤 打开树莓派摄像头 查看是否有图像,登录游览器打开树莓派IP地址的8080端口 获取mjpg的视频流url 代码 先设定好mjpg的视频流的url 利用opencv库中的v2.VideoCapture类读取mjpg视频流   cv2.VideoCapture() 检查摄像头是否成功打开,如果没有,则打印错误消息并退出程序 

    2024年02月03日
    浏览(42)
  • Unity3d 获取场景中摄像头视频流,实现直播效果(无需代码)

    Unity3d 获取场景中摄像头视频流,实现直播效果(无需代码)

    下面是具体操作流程:   1. 搭建服务器,选用github 一个开源的 node.js服务器。 下载地址GitHub - iizukanao/node-rtsp-rtmp-server: RTSP/RTMP/HTTP hybrid server,点击克隆,选择ZIP下载。  2. 下载node.js( 官网链接 Node.js)   选择下载最新版本,并根据提示一步步安装即可。 3.搭建服务器。 找到

    2023年04月08日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包