Qt在windows环境下如何使用Qcamera录制mp4格式的视频?
直接上代码.
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
完成