1#include <QDesktopServices>
3#include <QLoggingCategory>
6#include "MultimediaRecord.h"
8static Q_LOGGING_CATEGORY(log,
"WebBrowser.Record")
12 , m_pMediaDevices(
nullptr)
13 , m_VideoFrameStartTime(0)
16 qDebug(log) << Q_FUNC_INFO;
18 m_ParaRecord = pPara->m_Record;
19 m_pMediaDevices = &pPara->m_MediaDevices;
22 check = connect(&m_Recorder, &QMediaRecorder::recorderStateChanged,
23 this, &CMultimediaRecord::slotRecordStateChanged);
25 check = connect(&m_Recorder, &QMediaRecorder::errorOccurred,
26 this, &CMultimediaRecord::slotRecordError);
31CMultimediaRecord::~CMultimediaRecord()
33 qDebug(log) << Q_FUNC_INFO;
36void CMultimediaRecord::slotStart()
41 const auto inputs = QMediaDevices::audioInputs();
42 foreach(
auto input, inputs) {
43 if(input.id() == m_pMediaDevices->m_Para.m_AudioInput) {
44 m_AudioInput.setDevice(input);
45 m_CaptureSession.setAudioInput(&m_AudioInput);
50 m_CaptureSession.setVideoFrameInput(&m_VideoFrameInput);
52 m_ParaRecord >> m_Recorder;
53 m_CaptureSession.setRecorder(&m_Recorder);
54 m_VideoFrameStartTime = 0;
59void CMultimediaRecord::slotStop()
64 m_pMediaDevices =
nullptr;
67void CMultimediaRecord::slotUpdateVideoFrame(
const QImage image)
74 if(QImage::Format_ARGB32 != image.format())
75 img = image.convertToFormat(QImage::Format_ARGB32);
83 QVideoFrame frame(img);
85 if (m_VideoFrameStartTime == 0) m_VideoFrameStartTime = QDateTime::currentMSecsSinceEpoch() * 1000;
86 qint64 currentTime = QDateTime::currentMSecsSinceEpoch() * 1000 - m_VideoFrameStartTime;
87 frame.setStartTime(currentTime);
88 qreal rate = m_ParaRecord.GetVideoFrameRate();
91 frame.setEndTime(currentTime + qreal(1000000) / rate);
92 frame.setStreamFrameRate(m_ParaRecord.GetVideoFrameRate());
93 m_VideoFrameInput.sendVideoFrame(frame);
98void CMultimediaRecord::slotRecordStateChanged(QMediaRecorder::RecorderState state)
100 qDebug(log) <<
"Record state:" << state;
102 case QMediaRecorder::RecorderState::StoppedState: {
103 QString szFile = m_Recorder.actualLocation().toLocalFile();
104 switch(m_ParaRecord.GetEndAction())
106 case CParameterRecord::ENDACTION::OpenFile: {
107 bool bRet = QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
109 qCritical(log) <<
"Fail: Open capture page the file:" << szFile;
112 case CParameterRecord::ENDACTION::OpenFolder: {
113 QFileInfo fi(szFile);
114 QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absolutePath()));
124 case QMediaRecorder::RecorderState::RecordingState: {
133void CMultimediaRecord::slotRecordError(QMediaRecorder::Error error,
const QString &errorString)
135 qCritical(log) << error << errorString;
140CMultimediaRecordThread::CMultimediaRecordThread(
146 qDebug(log) << Q_FUNC_INFO;
147 connect(
this, &QThread::finished,
this, &QObject::deleteLater);
150CMultimediaRecordThread::~CMultimediaRecordThread()
152 qDebug(log) << Q_FUNC_INFO;
155void CMultimediaRecordThread::run()
158 if(!m_pRecord)
return;
159 connect(m_pRecord, &CMultimediaRecord::sigFinished,
160 this, &QThread::quit);
161 m_pRecord->slotStart();
167void CMultimediaRecordThread::slotUpdateVideoFrame(
const QImage image)
169 if(!m_pRecord)
return;
170 m_pRecord->slotUpdateVideoFrame(image);
173void CMultimediaRecordThread::slotQuit()
175 if(!m_pRecord)
return;
176 m_pRecord->slotStop();