|
@@ -163,7 +163,6 @@ void AvRecorder::initConnect()
|
|
|
m_recordBtn->setEnabled(true);
|
|
m_recordBtn->setEnabled(true);
|
|
|
m_liveBtn->setText("开始直播");
|
|
m_liveBtn->setText("开始直播");
|
|
|
}
|
|
}
|
|
|
- m_isLive = !m_isLive;
|
|
|
|
|
});
|
|
});
|
|
|
connect(m_microphoneWidget, &AudioWidget::SetVolumeScale, this, [this](float scale) {
|
|
connect(m_microphoneWidget, &AudioWidget::SetVolumeScale, this, [this](float scale) {
|
|
|
m_audioRecorder.SetVolumeScale(scale, MICROPHONE_INDEX);
|
|
m_audioRecorder.SetVolumeScale(scale, MICROPHONE_INDEX);
|
|
@@ -408,6 +407,8 @@ bool AvRecorder::startStream(std::string_view path, std::string_view format)
|
|
|
// m_captureComboBox->setEnabled(false); // 禁用采集源切换
|
|
// m_captureComboBox->setEnabled(false); // 禁用采集源切换
|
|
|
m_updateListBtn->setEnabled(false);
|
|
m_updateListBtn->setEnabled(false);
|
|
|
m_captureMethodBox->setEnabled(false); // 禁用采集方式切换
|
|
m_captureMethodBox->setEnabled(false); // 禁用采集方式切换
|
|
|
|
|
+
|
|
|
|
|
+ m_isLive = !m_isLive;
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -415,10 +416,19 @@ void AvRecorder::stopStream()
|
|
|
{
|
|
{
|
|
|
m_audioRecorder.StopRecord();
|
|
m_audioRecorder.StopRecord();
|
|
|
m_videoRecorder.StopRecord();
|
|
m_videoRecorder.StopRecord();
|
|
|
|
|
+
|
|
|
|
|
+ // 从录制器中卸载直播muxer
|
|
|
|
|
+ m_audioRecorder.UnloadMuxer(m_avMuxer);
|
|
|
|
|
+ m_videoRecorder.UnloadMuxer(m_avMuxer);
|
|
|
|
|
+
|
|
|
m_avMuxer.Close();
|
|
m_avMuxer.Close();
|
|
|
|
|
|
|
|
// 如果有同步录像,也需要关闭
|
|
// 如果有同步录像,也需要关闭
|
|
|
if (m_isSyncRecord) {
|
|
if (m_isSyncRecord) {
|
|
|
|
|
+ // 先从录制器中卸载同步录像muxer
|
|
|
|
|
+ m_audioRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+ m_videoRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+
|
|
|
m_recordMuxer.Close();
|
|
m_recordMuxer.Close();
|
|
|
m_isSyncRecord = false;
|
|
m_isSyncRecord = false;
|
|
|
}
|
|
}
|
|
@@ -431,6 +441,18 @@ void AvRecorder::stopStream()
|
|
|
}
|
|
}
|
|
|
bool AvRecorder::startSyncRecord()
|
|
bool AvRecorder::startSyncRecord()
|
|
|
{
|
|
{
|
|
|
|
|
+ // 检查是否已经在同步录像
|
|
|
|
|
+ if (m_isSyncRecord) {
|
|
|
|
|
+ qDebug() << "Sync recording is already active";
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查是否正在直播(必须在直播状态下才能启动同步录像)
|
|
|
|
|
+ if (!m_isLive) {
|
|
|
|
|
+ qDebug() << "Cannot start sync recording: not in live streaming mode";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
auto fileName = m_settingsParam.outputDir;
|
|
auto fileName = m_settingsParam.outputDir;
|
|
|
if (fileName.back() != '\\') {
|
|
if (fileName.back() != '\\') {
|
|
|
fileName.push_back('\\');
|
|
fileName.push_back('\\');
|
|
@@ -439,17 +461,48 @@ bool AvRecorder::startSyncRecord()
|
|
|
fileName += QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss").toStdString()
|
|
fileName += QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss").toStdString()
|
|
|
+ "_sync." + format;
|
|
+ "_sync." + format;
|
|
|
|
|
|
|
|
- __CheckBool(m_recordMuxer.Open(fileName, format));
|
|
|
|
|
- __CheckBool(m_audioRecorder.LoadMuxer(m_recordMuxer));
|
|
|
|
|
- __CheckBool(m_videoRecorder.LoadMuxer(m_recordMuxer));
|
|
|
|
|
- __CheckBool(m_recordMuxer.WriteHeader());
|
|
|
|
|
|
|
+ // 打开同步录像的muxer
|
|
|
|
|
+ if (!m_recordMuxer.Open(fileName, format)) {
|
|
|
|
|
+ qDebug() << "Failed to open sync record muxer";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 加载muxer到录制器
|
|
|
|
|
+ if (!m_audioRecorder.LoadMuxer(m_recordMuxer)) {
|
|
|
|
|
+ qDebug() << "Failed to load sync muxer for audio recorder";
|
|
|
|
|
+ m_recordMuxer.Close();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!m_videoRecorder.LoadMuxer(m_recordMuxer)) {
|
|
|
|
|
+ qDebug() << "Failed to load sync muxer for video recorder";
|
|
|
|
|
+ m_audioRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+ m_recordMuxer.Close();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 写入头部
|
|
|
|
|
+ if (!m_recordMuxer.WriteHeader()) {
|
|
|
|
|
+ qDebug() << "Failed to write sync muxer header";
|
|
|
|
|
+ m_audioRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+ m_videoRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+ m_recordMuxer.Close();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
m_isSyncRecord = true;
|
|
m_isSyncRecord = true;
|
|
|
|
|
+ qDebug() << "Sync recording started successfully: " << QString::fromStdString(fileName);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void AvRecorder::stopSyncRecord()
|
|
void AvRecorder::stopSyncRecord()
|
|
|
{
|
|
{
|
|
|
if (m_isSyncRecord) {
|
|
if (m_isSyncRecord) {
|
|
|
|
|
+ // 先从录制器中卸载muxer
|
|
|
|
|
+ m_audioRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+ m_videoRecorder.UnloadMuxer(m_recordMuxer);
|
|
|
|
|
+
|
|
|
|
|
+ // 然后关闭muxer
|
|
|
m_recordMuxer.Close();
|
|
m_recordMuxer.Close();
|
|
|
m_isSyncRecord = false;
|
|
m_isSyncRecord = false;
|
|
|
}
|
|
}
|