weixin_40008488 2022-11-30 14:04 采纳率: 0%
浏览 9

Qt qcamera video

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-30 16:01
    关注
    • 这篇博客: 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 
       
      在这里插入图片描述完成

    评论

报告相同问题?

问题事件

  • 创建了问题 11月30日

悬赏问题

  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏