QCamera6.7笔记

news2024/11/6 3:05:55

1.QCamera​

.h文件

#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
class QCamera_test1 : public QMainWindow
{
	Q_OBJECT

public:
	QCamera_test1(QWidget* parent = nullptr);
	~QCamera_test1();

private:
	Ui::QCamera_test1Class ui;
	QCamera* _camera;
	QMediaCaptureSession* _captureSession;
	//智能指针
	QScopedPointer<QImageCapture> imageCapture;//拍照

public slots:
	void btn_sopen_clicked();
	void btn_ssave_clicked();
	void processCapturedImage(int requestId, const QImage& img);


public:
	//显示拍照的图像在当前第0个画布
	void displayImage();
	void displayCapturedImage();
};

.cpp代码

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	//信号与槽点击打开相机按钮
	connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);
	//信号与槽点击保存相机按钮
	connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);

	//初始化相机和捕获会话
	this->_camera = new QCamera(QMediaDevices::defaultVideoInput());
	this->_captureSession = new QMediaCaptureSession();

	//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能
	this->imageCapture.reset(new QImageCapture);
	//imageCapture对象(通过get()方法获取原始指针)设置为mediaCaptureSession对象的图像捕捉设备
	this->_captureSession->setImageCapture(this->imageCapture.get());
	//连接信号和槽当图像被捕捉到时,imageCaptured信号会被触发,并调用processCapturedImage方法。
	connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);
	// 获取系统上可用的视频输入设备列表存入QList列表中。
	const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
	//for循环,遍历所有摄像头
	for (const QCameraDevice& cameraDevice : cameras) {
		//打印摄像头信息
		qDebug() << cameraDevice.description();
		//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera
		//设置摄像头设备,捕获会话视频输出以及摄像头。
		this->_camera->setCameraDevice(cameraDevice);
		//设置捕获会话视频输出
		this->_captureSession->setCamera(this->_camera);
		//把camera图像放入ui中;
		this->_captureSession->setVideoOutput(ui.videowidget);
	}
	 如果列表不为空,初始化相机和捕获会话  
	//if (!cameras.isEmpty()) {
	//	// 假设我们选择第一个摄像头(可以自己来决定)  
	//	QCameraDevice selectedCamera = cameras.first();
	//	// 初始化相机对象,并设置选定的摄像头设备  
	//	this->_camera = new QCamera(selectedCamera);
	//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中
	//	this->_captureSession->setCamera(this->_camera);
	//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)
	//	this->_captureSession->setVideoOutput(ui.videowidget);

	//	// 开始捕获会话(如果需要的话)  
	//	// this->_captureSession->start();  
	//}
	//else {
	//	// 处理没有可用摄像头的情况  
	//	qDebug() << "No cameras available.";
	//}




}

QCamera_test1::~QCamera_test1()
{}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{
	_camera->start();
}

void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {
	Q_UNUSED(requestId);
	QImage scaledImage = img.scaled(ui.videowidget->size(),
		Qt::KeepAspectRatio,
		Qt::SmoothTransformation);
	//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下
	ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));
	QTimer::singleShot(4000, this, &QCamera_test1::displayImage);
	displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {
	ui.stackedWidget->setCurrentIndex(0);
}

void QCamera_test1::displayCapturedImage() {
	ui.stackedWidget->setCurrentIndex(1);
}

//保存图片
void QCamera_test1::btn_ssave_clicked() {


	// 获取桌面路径  
	QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
	//获取当前时间
	QDateTime currentDataTime = QDateTime::currentDateTime();
	QString time = currentDataTime.toString("yyyyMMdd_hhmmss");
	// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  
	QString filePath = desktopPath + "/captured_image" + time + ".jpg";

	// 调用 captureToFile 方法保存图片到指定路径  
	this->imageCapture->captureToFile(filePath);
	QMessageBox::information(this, "提示", "保存成功");
}

ui文件
在这里插入图片描述

2.QCamera

2.1加入分辨率与帧率的显示与获取
.h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
#include <QVideoSink>//获取分辨率
#include <QCameraDevice>//设置分辨率与帧率
class QCamera_test1 : public QMainWindow
{
	Q_OBJECT

public:
	QCamera_test1(QWidget* parent = nullptr);
	~QCamera_test1();

private:
	Ui::QCamera_test1Class ui;
	QCamera* _camera;
	QMediaCaptureSession* _captureSession;
	QScopedPointer<QImageCapture> imageCapture;//拍照
	//QCameraDevice* cameraDevice;//摄像头设备
	QSize _resolution;//分辨率
	QSize _frameRate;//帧率
	QVideoSink* sink;
	int currentFrameRate; // 新增成员变量来存储当前帧率
public slots:
	void btn_sopen_clicked();
	void btn_ssave_clicked();
	void processCapturedImage(int requestId, const QImage& img);
	void btn_setfenbianlv_clicked();
	void onFrameChanged(const QVideoFrame& frame);
public:
	//显示拍照的图像在当前第0个画布
	void displayImage();
	void displayCapturedImage();
	void setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate);

};

.cpp文件

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	//信号与槽点击打开相机按钮
	connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);
	//信号与槽点击保存相机按钮
	connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);
	connect(ui.btn_set_fenbianlv, &QPushButton::clicked, this, &QCamera_test1::btn_setfenbianlv_clicked);
	//初始化相机和捕获会话
	this->_camera = new QCamera(QMediaDevices::defaultVideoInput());
	this->_captureSession = new QMediaCaptureSession();

	//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能
	this->imageCapture.reset(new QImageCapture);

	//设置捕获会话
	this->_captureSession->setImageCapture(this->imageCapture.get());
	connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);

	//QMediaDevices::videoInputs() 方法用于获取系统上可用的视频输入设备(如摄像头)的列表。
	// 这个方法返回一个 QList<QCameraDevice>,其中每个 QCameraDevice 对象都代表一个视频输入设备
	const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
	//for循环,遍历所有摄像头
	for (const QCameraDevice& cameraDevice : cameras) {
		//打印摄像头信息
		qDebug() << cameraDevice.description();
		//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera
		//设置摄像头设备,捕获会话视频输出以及摄像头。
		this->_camera->setCameraDevice(cameraDevice);
		//设置捕获会话视频输出
		this->_captureSession->setCamera(this->_camera);
		//把camera图像放入ui中;
		this->_captureSession->setVideoOutput(ui.videowidget);
	}

	//关于sink的作用,里面包含了关于帧的一些基本信息
	sink = this->_captureSession->videoSink();
	connect(sink, &QVideoSink::videoFrameChanged, this, &QCamera_test1::onFrameChanged);

	 如果列表不为空,初始化相机和捕获会话  
	//if (!cameras.isEmpty()) {
	//	// 假设我们选择第一个摄像头(可以自己来决定)  
	//	QCameraDevice selectedCamera = cameras.first();
	//	// 初始化相机对象,并设置选定的摄像头设备  
	//	this->_camera = new QCamera(selectedCamera);
	//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中
	//	this->_captureSession->setCamera(this->_camera);
	//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)
	//	this->_captureSession->setVideoOutput(ui.videowidget);

	//	// 开始捕获会话(如果需要的话)  
	//	// this->_captureSession->start();  
	//}
	//else {
	//	// 处理没有可用摄像头的情况  
	//	qDebug() << "No cameras available.";
	//}

}

QCamera_test1::~QCamera_test1()
{}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{
	_camera->start();
}

//保存图片
void QCamera_test1::btn_ssave_clicked() {
	// 获取桌面路径  
	QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
	//获取当前时间
	QDateTime currentDataTime = QDateTime::currentDateTime();
	QString time = currentDataTime.toString("yyyyMMdd_hhmmss");
	// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  
	QString filePath = desktopPath + "/captured_image" + time + ".jpg";
	// 调用 captureToFile 方法保存图片到指定路径  
	this->imageCapture->captureToFile(filePath);
	QMessageBox::information(this, "提示", "保存成功");
}
/**
 * @brief显示图像
 * @param requestId
 * @param img
 */
void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {
	Q_UNUSED(requestId);
	//对获取到的图像进行缩放
	QImage scaledImage = img.scaled(ui.videowidget->size(),
		Qt::KeepAspectRatio,
		Qt::SmoothTransformation);
	//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下
	ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));
	QTimer::singleShot(4000, this, &QCamera_test1::displayImage);
	displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {
	ui.stackedWidget->setCurrentIndex(0);
}
//显示图像在当前第1个画布
void QCamera_test1::displayCapturedImage() {
	ui.stackedWidget->setCurrentIndex(1);
}

//获取分辨率
void QCamera_test1::onFrameChanged(const QVideoFrame& frame) {
	QSize size = frame.size();
	qDebug() << "frame size: " << size << "frame rate: " << currentFrameRate;
	ui.lab_resl->setText(QString("%1 x %2 @ %3 fps").arg(QString::number(size.width()), QString::number(size.height()), QString::number(currentFrameRate)));
}
//设置分辨率
void QCamera_test1::btn_setfenbianlv_clicked() {
	// 设置相机的分辨率和帧率
	setCameraResolutionAndFrameRate(QSize(1280, 720), 30);
}
// 设置相机分辨率和帧率的函数
void QCamera_test1::setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate)
{   
	// 获取相机支持的格式
	QList<QCameraFormat> supportedFormats = _camera->cameraDevice().videoFormats();
	for (const QCameraFormat& format : supportedFormats) {
		if (format.resolution() == resolution && format.maxFrameRate() >= frameRate) {
			_camera->setCameraFormat(format);
			currentFrameRate = format.maxFrameRate();
			break;
		}
	}
}

在这里插入图片描述

3.录制视频

.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QCamera_test1.h"
#include <QCamera>
#include <QtMultimedia>
#include <QtMultimediaWidgets>
#include<QMediaCaptureSession>
#include <QMediaDevices>
#include <QImageCapture>//拍照
#include <QVideoSink>//获取分辨率
#include <QCameraDevice>//设置分辨率与帧率
#include <QMediaRecorder>//录制视频
class QCamera_test1 : public QMainWindow
{
	Q_OBJECT

public:
	QCamera_test1(QWidget* parent = nullptr);
	~QCamera_test1();
	//********************************************摄像头功能***********************************************
public:
	void InitCamera();//摄像头初始化
private:
	Ui::QCamera_test1Class ui;
	QCamera* _camera;//摄像头
	QMediaCaptureSession* _captureSession;//捕获会话
public slots:
	void btn_sopen_clicked();//打开摄像头


	//	**********************************************拍照功能***********************************************
public:
	void InitCameraCapture();//拍照初始化
	void displayImage();//显示拍照的图像在当前第0个画布
	void displayCapturedImage();//图像在当前第1个画布
	void setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate);// 设置相机分辨率和帧率的函数
private:
	QScopedPointer<QImageCapture> imageCapture;//拍照
	QCameraDevice* cameraDevice;//摄像头设备
	QVideoSink* sink;//获取分辨率信息
	int currentFrameRate; // 新增成员变量来存储当前帧率
public slots:
	void btn_setfenbianlv_clicked();//设置分辨率
	void onFrameChanged(const QVideoFrame& frame);//获取分辨率
	void btn_ssave_clicked();//拍照并保存
	void processCapturedImage(int requestId, const QImage& img);//显示图像到ui界面

	//	**********************************************录像功能*************************************************
public:
	void InitRecorder();//录像初始化
private:
	QMediaRecorder* mediaRecorder;  // 录像器
	QAudioInput* audioInput;//录音
public slots:
	void startRecording();  // 开始录像  
	void stopRecording();   // 停止录像 
	void onRecorderStateChanged(QMediaRecorder::RecorderState state);//相机录像状态改变
	void onDurationChanged(qint64 duration);//录像时间
};

​.cpp

#include "QCamera_test1.h"
#include <QDateTime>
QCamera_test1::QCamera_test1(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	InitCamera();//摄像头初始化

	InitCameraCapture();//相机拍照初始化

	InitRecorder();//录制器初始化

}

QCamera_test1::~QCamera_test1()
{}
//********************************************摄像头功能start***********************************************
//********************************************摄像头功能start***********************************************
//********************************************摄像头功能start***********************************************
/**
 * @brief 摄像头初始化
 */
void QCamera_test1::InitCamera() {

	//信号与槽点击打开相机按钮
	connect(ui.btn_open, &QPushButton::clicked, this, &QCamera_test1::btn_sopen_clicked);
	//初始化相机和捕获会话
	this->_camera = new QCamera(QMediaDevices::defaultVideoInput());
	this->_captureSession = new QMediaCaptureSession();
	//QMediaDevices::videoInputs() 方法用于获取系统上可用的视频输入设备(如摄像头)的列表。
	// 这个方法返回一个 QList<QCameraDevice>,其中每个 QCameraDevice 对象都代表一个视频输入设备
	const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
	//for循环,遍历所有摄像头
	for (const QCameraDevice& cameraDevice : cameras) {
		//打印摄像头信息
		qDebug() << cameraDevice.description();
		//创建摄像头对象,把遍历的摄像头设备放入摄像头对象中(只有一个摄像头的时候)把遍历的cameraDevice放入摄像头对象中_camera
		//设置摄像头设备,捕获会话视频输出以及摄像头。
		this->_camera->setCameraDevice(cameraDevice);
		//设置捕获会话视频输出
		this->_captureSession->setCamera(this->_camera);
		//把camera图像放入ui中;
		this->_captureSession->setVideoOutput(ui.videowidget);
	}
	 如果列表不为空,初始化相机和捕获会话  
	//if (!cameras.isEmpty()) {
	//	// 假设我们选择第一个摄像头(可以自己来决定)  
	//	QCameraDevice selectedCamera = cameras.first();
	//	// 初始化相机对象,并设置选定的摄像头设备  
	//	this->_camera = new QCamera(selectedCamera);
	//	// 初始化捕获会话对象,并设置相机和视频输出 ,把第一个相机放入媒体捕捉器中
	//	this->_captureSession->setCamera(this->_camera);
	//	//把camera图像放入ui中,在ui中显示。(选一个QWidget形状然后提升为QVideoWidget)
	//	this->_captureSession->setVideoOutput(ui.videowidget);
	//	// 开始捕获会话(如果需要的话)  
	//	// this->_captureSession->start();  
	//}
	//else {
	//	// 处理没有可用摄像头的情况  
	//	qDebug() << "No cameras available.";
	//}
}
//打开摄像头
void QCamera_test1::btn_sopen_clicked()
{
	_camera->start();
}
//********************************************摄像头功能end***********************************************
//********************************************摄像头功能end***********************************************
//********************************************摄像头功能end***********************************************







**********************************************拍照功能start*****************************************************************
**********************************************拍照功能start*****************************************************************
**********************************************拍照功能start*****************************************************************
/**
 * @brief 拍照初始化
 */
void QCamera_test1::InitCameraCapture() {
	//拍照功能,QImageCapture 类是一个高级图像录制类。它不是单独使用的,而是用于访问其他媒体对象的媒体录制功能
	this->imageCapture.reset(new QImageCapture);

	//设置捕获会话
	this->_captureSession->setImageCapture(this->imageCapture.get());
	connect(this->imageCapture.get(), &QImageCapture::imageCaptured, this, &QCamera_test1::processCapturedImage);
	//信号与槽点击保存相机按钮
	connect(ui.btn_save, &QPushButton::clicked, this, &QCamera_test1::btn_ssave_clicked);
	connect(ui.btn_set_fenbianlv, &QPushButton::clicked, this, &QCamera_test1::btn_setfenbianlv_clicked);
	//关于sink的作用,里面包含了关于帧的一些基本信息
	sink = this->_captureSession->videoSink();
	connect(sink, &QVideoSink::videoFrameChanged, this, &QCamera_test1::onFrameChanged);

}
//保存图片
void QCamera_test1::btn_ssave_clicked() {
	// 获取桌面路径  
	QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
	//获取当前时间
	QDateTime currentDataTime = QDateTime::currentDateTime();
	QString time = currentDataTime.toString("yyyyMMdd_hhmmss");
	// 构建完整的文件路径,这里使用了一个简单的文件名,你可以根据需要更改  
	QString filePath = desktopPath + "/captured_image" + time + ".jpg";
	// 调用 captureToFile 方法保存图片到指定路径  
	this->imageCapture->captureToFile(filePath);
	QMessageBox::information(this, "提示", "保存成功");
}
/**
 * @brief显示图像
 * @param requestId
 * @param img
 */
void QCamera_test1::processCapturedImage(int requestId, const QImage& img) {
	Q_UNUSED(requestId);
	//对获取到的图像进行缩放
	QImage scaledImage = img.scaled(ui.videowidget->size(),
		Qt::KeepAspectRatio,
		Qt::SmoothTransformation);
	//显示当前图像,4秒之后不再显示,默认保存到系统相册路径下
	ui.viewfinder->setPixmap(QPixmap::fromImage(scaledImage));
	QTimer::singleShot(4000, this, &QCamera_test1::displayImage);
	displayCapturedImage();
}
//显示拍照的图像在当前第0个画布
void QCamera_test1::displayImage() {
	ui.stackedWidget->setCurrentIndex(0);
}
//显示图像在当前第1个画布
void QCamera_test1::displayCapturedImage() {
	ui.stackedWidget->setCurrentIndex(1);
}

//获取分辨率
void QCamera_test1::onFrameChanged(const QVideoFrame& frame) {
	QSize size = frame.size();
	qDebug() << "frame size: " << size << "frame rate: " << currentFrameRate;
	ui.lab_resl->setText(QString("%1 x %2 @ %3 fps").arg(QString::number(size.width()), QString::number(size.height()), QString::number(currentFrameRate)));
}
//设置分辨率
void QCamera_test1::btn_setfenbianlv_clicked() {
	// 设置相机的分辨率和帧率
	setCameraResolutionAndFrameRate(QSize(1280, 720), 15);
}
// 设置相机分辨率和帧率的函数
void QCamera_test1::setCameraResolutionAndFrameRate(const QSize& resolution, int frameRate)
{
	// 获取相机支持的格式
	QList<QCameraFormat> supportedFormats = _camera->cameraDevice().videoFormats();
	for (const QCameraFormat& format : supportedFormats) {
		if (format.resolution() == resolution && format.maxFrameRate() >= frameRate) {
			_camera->setCameraFormat(format);
			currentFrameRate = format.maxFrameRate();
			break;
		}
	}
}
**********************************************拍照功能end*****************************************************************
**********************************************拍照功能end*****************************************************************
**********************************************拍照功能end*****************************************************************








**********************************************录像功能start*****************************************************************
**********************************************录像功能start*****************************************************************
**********************************************录像功能start*****************************************************************

/**
 * @brief 初始化媒体录制器
 */
void QCamera_test1::InitRecorder() {
	//初始化媒体录制器
	mediaRecorder = new QMediaRecorder(this->_camera);
	connect(ui.btn_start_recording, &QPushButton::clicked, this, &QCamera_test1::startRecording);
	connect(ui.btn_stop_recording, &QPushButton::clicked, this, &QCamera_test1::stopRecording);
	connect(mediaRecorder, &QMediaRecorder::recorderStateChanged, this, &QCamera_test1::onRecorderStateChanged);
	connect(mediaRecorder, &QMediaRecorder::durationChanged, this, &QCamera_test1::onDurationChanged);
}

//开始录像
void QCamera_test1::startRecording()
{
	// 初始化媒体录制器  

	_captureSession->setRecorder(mediaRecorder);
	mediaRecorder->setVideoResolution(1280, 720);  // 设置默认分辨率 

	mediaRecorder->setQuality(QMediaRecorder::HighQuality);
	mediaRecorder->setOutputLocation(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + "/demo.mp4"));
	mediaRecorder->setEncodingMode(QMediaRecorder::ConstantQualityEncoding);
	mediaRecorder->setAudioChannelCount(mediaRecorder->audioChannelCount());
	if (mediaRecorder->recorderState() != QMediaRecorder::RecordingState) {
		// 获取桌面路径用于保存录像    
		QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
		QDateTime currentDataTime = QDateTime::currentDateTime();
		QString time = currentDataTime.toString("yyyyMMdd_hhmmss");
		QString filePath = desktopPath + "/recorded_video" + time + ".mp4";

		mediaRecorder->setOutputLocation(QUrl::fromLocalFile(filePath));
		mediaRecorder->record();
	}
	else {
		qDebug() << "Camera is not active or already recording.";
	}
}
/**
 * @brief 停止录制
 */
void QCamera_test1::stopRecording()
{
	mediaRecorder->stop();
}
/**
 * @brief
 * @param state 相机录像状态改变
 */
void QCamera_test1::onRecorderStateChanged(QMediaRecorder::RecorderState state)
{
	switch (state) {
	case QMediaRecorder::RecordingState:
		qDebug() << "Recording started.";
		break;
	case QMediaRecorder::StoppedState:
		qDebug() << "Recording stopped.";
		QMessageBox::information(this, "提示", "录制成功");
		break;
	default:
		break;
	}
}
/**
 * @brief 录制时间
 * @param duration
 */
void QCamera_test1::onDurationChanged(qint64 duration)
{
	qDebug() << "Recording duration:" << QTime::fromMSecsSinceStartOfDay(duration).toString("hh:mm:ss.zzz");
	ui.labelTime88->setText(QTime::fromMSecsSinceStartOfDay(duration).toString("hh:mm:ss.zzz"));
}
**********************************************录像功能end*****************************************************************
**********************************************录像功能end*****************************************************************
**********************************************录像功能end*****************************************************************

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的美食推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

KEYSIGHT N993xA 手持频谱分析仪(SA)

N993xA 手持频谱分析仪(SA) 苏州新利通 N993xA 手持频谱分析仪(SA) FieldFox 手持式射频和微波分析仪 Keysight FieldFox 便携式分析仪可以在非常恶劣的工作环境中&#xff0c;轻松完成从日常维护到深入故障诊断的各项工作。 选择最适合您需求且有强大软件支持的 Keysight …

vector中push_back和emplace_back的区别

push_back 在引入右值引用&#xff0c;转移构造函数&#xff0c;转移复制运算符之前&#xff0c;通常使用push_back()向容器中加入一个右值元素&#xff08;临时对象&#xff09;的时候&#xff0c;首先会调用构造函数构造这个临时对象&#xff0c;然后需要调用拷贝构造函数将…

Java项目实战II基于Java+Spring Boot+MySQL的免税商品优选购物商城(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着全球贸易的日益繁荣和消费者需求的多样化&#xff0c;免税商品购物已成为众多旅行者和消费者的热…

【C++】set详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

对异步处理的http接口进行性能测试

最近来了新的领导&#xff0c;测试的内容和范畴都变大了&#xff0c;工作内容涉及到APP&#xff0c;线上出现了由于性能引起的bug&#xff0c;不得不进行压测&#xff0c;只能不断的学习了。害&#xff0c;想做一条咸鱼都那么难&#xff0c;找了很多关于接口性能测试的资料&…

模板初阶、auto关键字、范围for和string类的使用

目录 1. 模板初阶 1.1 泛型编程 1.2 函数模板 1.3 类模板 2. auto关键字 3. 范围for的使用&#xff08;略提&#xff09; 4. String类部分接口的使用 4.1 String构造函数的使用 4.2 string类begin和end的使用 4.3 string类的rbegin和rend的使用 4.4 string类的size和length的使…

使用 npkill 快速清理本地 node_modules 文件

npkill 可以直接在终端可视化的清除 本地 node_modules 文件夹&#xff0c;方便我们即使清除不常用的依赖。 直接在终端执行 npx npkill 即可开启 node_modules 本地扫描&#xff1a; 然后&#xff0c;我们选择不需要的 node_modules 按下空格即可删除。

sentinel2 L2A处理基线04.00 反射率计算方法

sentinel2 处理基线04.00发布后&#xff0c;L2A地表反射率计算方式也发生了调整&#xff1b;根据新版的数据说明&#xff0c;新版数据增加了负值偏移。因此计算时需要读取数据产品中MTD_MSIL2A.xml的元文件。注意&#xff0c;相比之前的版本&#xff0c;元文件中增加了BOA_ADD_…

django创建一个新的应用

使用 python manage.py startapp myapp 命令可以在你的 Django 项目中创建一个新的应用&#xff0c;名为 myapp。应用是 Django 项目的组成部分&#xff0c;可以帮助你组织代码和功能。执行该命令后&#xff0c;会在你的项目目录下创建一个名为 myapp 的文件夹&#xff0c;包含…

docker部署minio文件服务器

1. 拉取镜像 docker search minio docker pull minio/minio2. 创建映射 mkdir -p /root/docker_app/minio_data mkdir -p /root/docker_app/minio_config3. 执行docker run 自定义用户和秘钥安装: admin/admin123456 docker run -p 9000:9000 -p 9001:9001 -d --name mini…

JavaScript 可视化案例详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

大模型驱动的自主智能体全面调研

人工智能咨询培训老师叶梓 转载标明出处 基于LLMs构建的自主智能体&#xff0c;有望实现类似人类的决策能力。图 1 展示了LLMs驱动的自主智能体领域的增长趋势。从2021年1月到2023年8月&#xff0c;不同颜色代表不同类别的智能体。例如&#xff0c;游戏智能体旨在模拟游戏玩家…

MySQL那些事(InnoDB架构和存储结构)

目录 一、序言二、InnoDB架构三、InnoDB内存结构1、Buffer Pool (缓冲池)2、Change Buffer3、Log Buffer 四、InnoDB磁盘结构1、表空间2、Doublewrite Buffer(双写缓冲区)3、Redo Log4、Undo Log 五、结语 一、序言 本节内容为博主根据MySQL 8.0版本官方文档手动翻译过后的最新…

pycharm 配置篇

方法注释 使用方式为&#xff0c;在方法名下方输入三个双&#xff08;单&#xff09;引号&#xff0c;回车&#xff0c;自动生成。五种风格的样式如下&#xff1a; def docstrings_func_plain(parm_a, parm_b, parm_c):"""Plain 风格"""def docs…

笔记本电脑如何改ip地址:操作指南与注意事项

在信息时代的浪潮中&#xff0c;网络已成为我们日常生活与工作中不可或缺的一部分。对于笔记本电脑用户而言&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;其重要性不言而喻。无论是出于网络安全、网络测试还是特殊网络环境等需求&#xff0c;了解如何修改笔记本电…

NVIDIA Hopper 架构深入

NVIDIA Hopper 架构 GPU 的重要新功能。 文章目录 一、Transformer engine 变压器发动机二、第四代 NVLink 和 NVLink 网络三、第三代 NVSwitch四、New NVLink Switch System 新的 NVLink 开关系统五、PCIe Gen 5 PCIe 第 5 代一、Transformer engine 变压器发动机 Transforme…

java给word设置复选框

poi设置 使用"Wingdings 2" 字体 WordUtil.appendText(paragraph, "\uF052", "Wingdings 2",null); WordUtil.appendText(paragraph, "□", null);选中的复选框: poi导出pdf的时候正常使用aspose-words导出pdf就空了 使用默认字体…

给自己的项目(vue3)中添加 下雪/樱花飘落的背景

查看更佳效果前往我的博客&#xff0c; 可切换 snows_ls BLOGhttp://124.223.41.220/ 0、效果图 樱花飘落 雪花飘落 1、安装 yarn add jparticles / npm i jparticles 2、引入 import { Snow } from jparticles; // 引入粒子效果库 引入雪花效果库 3、使用 在项目中的app.…

onnx TRT 版本对应关系

Onnx 版本和opset 关系 https://github.com/onnx/onnx/blob/main/docs/Versioning.md Onnx runtime 对应 onnx opset 版本 Compatibility | onnxruntime Tensor RT 和onnx 支持版本可以看如下并选择对应分支 https://github.com/onnx/onnx-tensorrt/blob/release/8.4-GA/doc…