Qt应用程序开发八:Qt摄像头QCamera应用

效果图:

Qt应用程序开发八:Qt摄像头QCamera应用

//****Camera.pro

QT       += core gui
QT      += multimediawidgets
QT      += multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ****Camera
TEMPLATE = app


SOURCES += main.cpp\
        ****Camera.cpp

HEADERS  += ****Camera.h

FORMS    += ****Camera.ui
//****Camera.h

#ifndef ****CAMERA_H
#define ****CAMERA_H

#include <QWidget>
#include<QCamera>
#include<QCameraViewfinder>
#include<QCameraImageCapture>
#include<QMediaRecorder>


namespace Ui {
class ****Camera;
}

class ****Camera : public QWidget
{
    Q_OBJECT

public:
    explicit ****Camera(QWidget *parent = 0);
    ~****Camera();
    void openCamera(QString description=QString());
    void enumCamera();
    void bindRecoder(QCamera *camera);

private slots:
    void on_btn_record_video_clicked();

    void on_btn_cut_image_clicked();

    void onImageCaptured(int id,QImage img);

    void on_btn_open_camera_clicked();

    void on_btn_record_video_stop_clicked();

private:
    Ui::****Camera *ui;
    QCamera*               mCamera;         //摄像头对象
    QCameraViewfinder*     mViewfinder;     //摄像头取景器
    QCameraImageCapture*   mImageCapture;   //截图对象
    QMediaRecorder*        mMediaRecorder;  //视频录制对象


};

#endif // ****CAMERA_H
//****Camera.cpp

#include "****Camera.h"
#include "ui_****Camera.h"
#include<QCameraInfo>
#include<QDebug>
#include<QAudioEncoderSettings>
#include<QUrl>

****Camera::****Camera(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::****Camera)
{
    ui->setupUi(this);
    mCamera = NULL;
    mViewfinder = new QCameraViewfinder(ui->widget_camrea_view);
    mViewfinder->resize(ui->widget_camrea_view->size());
    mViewfinder->setAspectRatioMode(Qt::KeepAspectRatio);//设置全视角显示
    enumCamera();

}

****Camera::~****Camera()
{

    if(mCamera != NULL)
    mCamera->stop();
    delete ui;
}

void ****Camera::openCamera(QString description)
{
    if(description.isEmpty()){
        QCameraInfo info = QCameraInfo::defaultCamera(); //默认摄像头
        mCamera = new QCamera(info,this);
    }else{
        QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
        foreach (const QCameraInfo &cameraInfo, cameras){
            if(cameraInfo.description() == description){
                mCamera = new QCamera(cameraInfo,this);
                break;
            }
        }
    }
    mCamera->setCaptureMode(QCamera::CaptureVideo);
    connect(mCamera, static_cast<void(QCamera::*)(QCamera::Error)>(&QCamera::error),
         [=](QCamera::Error value){ qDebug()<<value;});

    //设置摄像头取景器
    mCamera->setViewfinder(mViewfinder);
    //绑定截图对象
    mImageCapture = new QCameraImageCapture(mCamera);
    connect(mImageCapture,SIGNAL(imageCaptured(int,QImage)),SLOT(onImageCaptured(int,QImage)));
    bindRecoder(mCamera);
    //开启摄像头
    mCamera->start();


}

/*
@brief       枚举摄像头
@return
*/
void ****Camera::enumCamera()
{
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras){
         ui->comboBox_camera->addItem(cameraInfo.description());
    }
}
/*
@brief          设置录制格式
@param  camera  摄像头对象
@return
windows 下测试无效,其他解决方案 用QtMEL 详情 http://kibsoft.ru/
*/
void ****Camera::bindRecoder(QCamera *camera)
{
    mMediaRecorder = new QMediaRecorder(camera,this);
    connect(mMediaRecorder, static_cast<void(QMediaRecorder::*)(QMediaRecorder::Error)>(&QMediaRecorder::error),
        [=](QMediaRecorder::Error error){ qDebug()<<error;});
    connect(mMediaRecorder,&QMediaRecorder::statusChanged,[=](QMediaRecorder::Status status){qDebug()<<status;});

    //设置音频编码格式
    QAudioEncoderSettings audioSettings;
    audioSettings.setCodec("audio/amr");
    audioSettings.setQuality(QMultimedia::HighQuality);
    //mMediaRecorder->setAudioSettings(audioSettings);

    QVideoEncoderSettings settings = mMediaRecorder->videoSettings();

    settings.setResolution(640,480);
    settings.setQuality(QMultimedia::VeryHighQuality);
    settings.setFrameRate(30.0);
    settings.setCodec("video/mp4");

    mMediaRecorder->setVideoSettings(settings);
    mMediaRecorder->setOutputLocation(QUrl(qApp->applicationDirPath() + "/xzp.mp4"));
}


void ****Camera::on_btn_record_video_clicked()
{

    if(!mCamera) return;
    qDebug()<<"start record";
    mMediaRecorder->record();
}

void ****Camera::on_btn_cut_image_clicked()
{
    if(!mCamera) return;
    mImageCapture->capture();
}

/*
@brief       显示截图
@param id    截图ID
@param img   mImageCapture截图返回的图片信息
@return
*/
void ****Camera::onImageCaptured(int id, QImage img)
{
    qDebug()<<id;
    ui->lab_cutImage->setPixmap(QPixmap::fromImage(img).scaled(ui->lab_cutImage->size()));
}

void ****Camera::on_btn_open_camera_clicked()
{
    openCamera();//打开默认摄像头
    //openCamera(ui->comboBox_camera->currentText()); 打开选择的摄像头

}

void ****Camera::on_btn_record_video_stop_clicked()
{
    if(!mCamera) return;
    mMediaRecorder->stop();
}