c++

c++ qt windows用QCamera录制视频并保存为h264编码的mp4文件

前言

以前用delphi做了个小项目,就是摄像头录像,然后保存成文件,并把文件存到文件服务器

那会保存的时asf格式,因为为了节省空间。

在学习qt时,各种lib用的,非常方便。

本文用到:

libx264       作用h264编码

libmp4v2     作用保存为mp4文件流

qt 组件

  private:
    QCamera *camera;  //摄像头
    QCameraViewfinder *viewfind; //取景器
    QList<QCameraInfo> cameras;  //摄像头列表
    QCameraImageCapture *imageCapture; //照片采集
 
    ImageThreadView *imagethread = NULL;  //采集线程
 
    MP4Encoder encoder;//h264 与mp4编码器

1,列举电脑多媒体设备

    cameras = QCameraInfo::availableCameras();
	foreach (const QCameraInfo &cameraInfo ,cameras)
	{
		ui->cbb_camera->addItem(cameraInfo.description());//写入combobox 
 
	}

2,定义一个线程类,用来不断的采集摄像头图片,并写入编码后MP4

class ImageThreadView :public QThread  //线程显示类 
{
	Q_OBJECT
public:
	explicit ImageThreadView(QCamera *camera,QObject *parent = 0);
	~ImageThreadView();
	void close();
protected:
		void run();
 
private:
	QCameraImageCapture *imageCapture; //照片采集
	
	
 
signals:
	void sendCapture(QImage image); //发送采集信号
private slots:
	void on_imagecapture(int index, const QImage &image);//QCameraImageCapture 的采集事件
public:
	BOOL IsQuit = FALSE; //是否退出循环

3,在窗口类里定义一个槽函数,接收线程发来的信号

	void on_btn_start_clicked();;//开始录像
	void on_btn_stop_clicked();//停止录像
 
	void recvImage(QImage image);//收到线程的图片信号 显示在ui上

4,开始录像

void UIDemo01::on_btn_start_clicked()
{
	QMessageBox::information(this, "提示", "开始录像");
 
	QString filename = QDateTime::currentDateTime().toString("yyyyMMddHHmmss") + ".mp4";//保存路径
	encoder.create(filename.toStdString().c_str(), 1280, 720);//x264  mp4 编码器
 
	camera = new QCamera(this);//摄像头捕捉
	viewfind = new QCameraViewfinder();//取景器
 
	//QCameraViewfinderSettings VfSettings;
	//VfSettings.setResolution(1280,720);
	//VfSettings.setPixelFormat(QVideoFrame::Format_NV12);
	//VfSettings.setMaximumFrameRate(15);
	//camera->setViewfinderSettings(VfSettings);//设置当前相机的取景器
 
 
	
	imagethread = new ImageThreadView(camera,this);//创建线程
	
	connect(imagethread, SIGNAL(sendCapture(QImage)), this, SLOT(recvImage(QImage)));//接收图片信号绑定,然后处理为h264
 
	//imageCapture = new QCameraImageCapture(camera);
	//connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(on_imagecapture(int, QImage)));
	//viewfind->show();
	camera->setViewfinder(viewfind);//摄像头绑定取景器
 
	camera->start();//开启摄像头
	imagethread->start();//开启取图线程
 
}

demo下载

您需要先支付 9.9元 才能查看此处内容!立即支付

AI相关的一切

留言

您的邮箱地址不会被公开。 必填项已用 * 标注