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元 才能查看此处内容!立即支付