Qt qcamera video

Qt在windows环境下如何使用Qcamera录制mp4格式的视频?

  • 这篇博客: QT QCamera操作摄像头拍照调试记录中的 QT QCamera操作摄像头拍照调试记录 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 直接上代码.

    widget.h

    #define WIDGET_H
    
    #include <QWidget>
    
    #include <QCamera>
    #include <QCameraControl>
    #include <QCameraViewfinder>
    #include <QCameraImageCapture>
    
    #include <QList>
    #include <QDebug>
    #include <QImage>
    #include <QBuffer>
    #include <QMediaRecorder>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    public slots:
        void ShowTheCapture();
        void SavePicture();
        void displayImage(int,QImage image);
        void displayvideo(int, QVideoFrame video);
        void issaved(int, const QString &fileName);
    
    public:
        QCamera *camera;//摄像头
        QCameraImageCapture * imageCapture;//截图部件
        QBuffer buf;
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    #include <QBuffer>
    #include <QDir>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        ui->label->setScaledContents(true); //自适应内容大小,用来展示截图
    
        camera=new QCamera;//摄像头
        imageCapture=new QCameraImageCapture(camera);//截图部件
    	
    	
        QCameraViewfinderSettings set; //相机取景设置可以设置分辨率.帧率...详细参考官方文档
        //set.setResolution(800, 600); //设置显示分辨率,嵌入式设备需要手动指定
        set.setMaximumFrameRate(30);  //设置帧率,//由于前期在电脑测试成功.移植到嵌入式开发板的时候发现视频采集画面卡顿,调试发现帧率不匹配.在这里需要手动设置下.
        camera->setViewfinderSettings(set);
        camera->setViewfinder(ui->viewfinder);
        camera->start(); //启动摄像头
    	
    	//为了测试嵌入式设备是否支持帧缓存.嵌入式设备保存文件操作很慢.用来检测是否支持缓存
        //qDebug() << imageCapture->isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer);
        //qDebug() << imageCapture->isCaptureDestinationSupported(QCameraImageCapture::CaptureToFile);
    
        imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
        //imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
    
        imageCapture->setBufferFormat(QVideoFrame::PixelFormat::Format_Jpeg);  //设置保存的图片格式
    
        connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(displayImage(int,QImage)));
        connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(issaved(int,QString)));
        //connect(imageCapture, SIGNAL(imageAvailable(int,QVideoFrame)), this, SLOT(displayvideo(int,QVideoFrame)));
    
        connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(ShowTheCapture()));
        connect(ui->SaveButton,SIGNAL(clicked()),this,SLOT(SavePicture()));
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::ShowTheCapture()
    {
    	//按下截图按钮
        camera->setCaptureMode(QCamera::CaptureStillImage);  //截图模式
        camera->searchAndLock();   //加锁
        imageCapture->capture();   //取景器截图, 内部机制参考官方文档,
        //不指定参数时,有个默认保存路径.一般都默认当前用户主目录
        //imageCapture->capture("/tmp/test.jpg"); //这里自定保存路径   
        camera->unlock();
    }
    
    void Widget::displayImage(int ,QImage image)
    {
    	//显示帧内容
        //image=image.convertToFormat(QImage::Format_RGB888);
        ui->label->setPixmap(QPixmap::fromImage(image));
    }
    
    void Widget::issaved(int id, const QString &fileName)
    {
        //图片保存成功后自动调用,fileName就是保存的图片绝对路径
        qDebug() << "Save file: " << fileName;
        camera->setCaptureMode(QCamera::CaptureViewfinder);  //重新设置摄像头模式取景显示.要不然取景器画面会卡住.
        QDir dir;
        dir.remove(fileName);  //这里删除系统自动保存的图片.后面进行自己处理 SavePicture()
    }
    
    void Widget::displayvideo(int, QVideoFrame video)
    {
        qDebug() << video.endTime();
    }
    
    void Widget::SavePicture()
    {
    	//自定义的图片处理
        qDebug() << "Mine ";
        //imageCapture->cancelCapture(); 
        
        const QPixmap *pixmap = ui->label->pixmap();
        if(pixmap)
        {
            pixmap->save("/mnt/test/qttest/qt5test/hello.jpg");  //自己保存图片,以及后续处理
            qDebug()<<"Send Base64";
            QByteArray ba;
            QBuffer buf(&ba);
            
            //这里将图片转Base64
            pixmap->save(&buf,"jpg");
            QByteArray hexed = ba.toBase64();
            buf.close();
    
           qDebug() << "Base64" << hexed.data();
        }
        ui->label->clear();
    }
    
    

    main.cpp 没有什么

    #include "widget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    
    

    widget.ui

    ui->viewfinder 是一个QWidget  需要提升窗口部件为 QCameraViewfinder 
     
    在这里插入图片描述完成