QCamera打开uvc camera,获取mjpeg数据流

本文是在上一篇opencv 打不开uvc camera的MJPEG格式的数据流的问题 的基础上,转用QCamera,最终能拿到camera数据。

ucv camera介绍

UVC全程是"USB Video Class",即USB视频类,是为USB视频捕获设备定义的一种协议,是由Microsoft和另几家设备厂商联合推出的标准协议,现在已经是USB org标准协议之一。
现在的主流操作系统(如Windows XP SP2 and later,Linux 2.4.6 and later,MacOS 10.5 and later)都提供了UVC设备驱动,所以UVC camera连上电脑是可以被直接识别的,而一般的USB摄像头需要安装额外的驱动才可以被识别。

QCamera获取uvc camera的MJPEG数据流

 QList<QCameraInfo> cameras=QCameraInfo::availableCameras();   //获取所有可以支持的camera,包括Integrated camera和uvc camera
        foreach (const QCameraInfo &camerasInfo, cameras) {
            qDebug()<<"camera:"<<camerasInfo.description();
             qDebug()<<"name:"<<camerasInfo.deviceName();
               if(camerasInfo.description().contains("UVC")){
                qDebug()<<"name:"<<camerasInfo.deviceName();
                mCamera=new QCamera(camerasInfo);  //由camerainfo创建qcamera
                mCaptureVideoFrame=new CaptureVideoFrame(this);  //视频帧接收类,因为需要用自己写的opengl渲染,所以有了这个类,用来拿到相机的当前帧
                connect(mCaptureVideoFrame,SIGNAL(CaptureFrame(QVideoFrame)),this,SLOT(on_captrueframecallback(QVideoFrame)));
                mCaptureVideoFrame->setSource(mCamera);
            }
        }
      //  mCamera->setViewfinder(mFinder);  //通过viewfinder渲染出视频流
        QCameraViewfinderSettings sets;   //取景器设置
        sets.setPixelFormat(QVideoFrame::Format_Jpeg);  //设置视频格式为Jpeg,对应CaptureVideoFrame中的Format_Jpeg格式。
        sets.setMinimumFrameRate(30);  //设置最小的帧率
        sets.setMaximumFrameRate(30);   //设置最大的帧率
        sets.setResolution(3840,2160);   //设置获取的视频流的分辨率(因为此高分辨率是jpeg格式传输的)
        mCamera->setViewfinderSettings(sets);  //将取景器设置到qcamera
        mCamera->start();  //开启相机
        
        QList<QCameraViewfinderSettings > ViewSets = mCamera->supportedViewfinderSettings();   //可以打印出该camera支持的所有的分辨率及格式
        foreach (QCameraViewfinderSettings ViewSet, ViewSets) {
            qDebug()<<"haha"<<ViewSet.pixelFormat()<<" "<<ViewSet.resolution().width()<<" "<<ViewSet.resolution().height()<<","<<ViewSet.minimumFrameRate();
        }

关于capturevideoframe.h

#ifndef CAPTUREVIDEOFRAME_H
#define CAPTUREVIDEOFRAME_H
#include <QAbstractVideoSurface>
#include <QVideoProbe>
#include <QCamera>

class CaptureVideoFrame:public QAbstractVideoSurface
{
    Q_OBJECT
public:
   explicit CaptureVideoFrame(QObject *parent=0);
    ~CaptureVideoFrame();
    bool setSource(QCamera *pCamera);  //设置qcamera

    virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const;  //重写支持的像素格式


signals:
    void CaptureFrame(const QVideoFrame &frame);

private slots:
    virtual bool present(const QVideoFrame &frame);  //重写当前帧

private:
    QVideoFrame m_Probe;
};

#endif // CAPTUREVIDEOFRAME_H

关于capturevideoframe.cpp
#include "capturevideoframe.h"

CaptureVideoFrame::CaptureVideoFrame(QObject *parent):QAbstractVideoSurface(parent)
{

}

QList<QVideoFrame::PixelFormat> CaptureVideoFrame::supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const{
    Q_UNUSED(type);

    QList<QVideoFrame::PixelFormat> lst;
    lst.push_back(QVideoFrame::Format_Jpeg);  //添加支持JPeg格式,否则获取不到数据
    lst.push_back(QVideoFrame::Format_YUYV);
    lst.push_back(QVideoFrame::Format_RGB32);
    lst.push_back(QVideoFrame::Format_BGR32);
    lst.push_back(QVideoFrame::Format_RGB565);

    return lst;
}

CaptureVideoFrame::~CaptureVideoFrame(){

}

bool CaptureVideoFrame::setSource(QCamera *pCamera){
    bool ret=true;
    pCamera->setViewfinder(this);
    return ret;
}

bool CaptureVideoFrame::present(const QVideoFrame &frame){
    emit CaptureFrame(frame);  //拿到数据帧,通过信号槽,最终通过opengl渲染出frame中的数据.
    return true;
}

最终渲染出数据后还是蛮激动的,其实并不是很难,只是对格式不熟,所以卡住了,特地记录下。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值