zhuizhu há 8 meses atrás
pai
commit
80521d5b97

+ 2 - 2
AvRecorder/capturer/audio/audio_capturer.cpp

@@ -35,7 +35,7 @@ bool AudioCapturer::Start()
 {
     __CheckBool(_isInit);
     _loopFlag = true;
-    PlaySoundA("./rc/mute.wav", nullptr, SND_FILENAME | SND_ASYNC | SND_LOOP);
+    // PlaySoundA("./rc/mute.wav", nullptr, SND_FILENAME | SND_ASYNC | SND_LOOP);
     _captureThread = new std::thread(
         [this] { _ThreadRun(_pAudioClient, _pAudioCaptureClient); });
     return true;
@@ -54,7 +54,7 @@ void AudioCapturer::Stop()
     if (_pAudioClient != nullptr) {
         _pAudioClient->Stop();
     }
-    PlaySoundA(nullptr, nullptr, SND_FILENAME | SND_ASYNC | SND_LOOP);
+    //PlaySoundA(nullptr, nullptr, SND_FILENAME | SND_ASYNC | SND_LOOP);
 
     Free(_pAudioClient, [this] { _pAudioClient->Release(); });
     Free(_pDevice, [this] { _pDevice->Release(); });

+ 3 - 2
AvRecorder/capturer/audio/audio_qt_capturer.cpp

@@ -228,7 +228,8 @@ int QtAudioCapturer::readAudioData(char* buf, int maxLen)
 {
     QMutexLocker locker(&m_mutex);
     int toRead = qMin(maxLen, m_dataBuffer.size());
-    qDebug() << "[readAudioData] toRead=" << toRead << ", m_dataBuffer.size()=" << m_dataBuffer.size();
+    // qDebug() << "[readAudioData] toRead=" << toRead
+    //          << ", m_dataBuffer.size()=" << m_dataBuffer.size();
     if (toRead > 0) {
         memcpy(buf, m_dataBuffer.constData(), toRead);
         m_dataBuffer.remove(0, toRead);
@@ -239,7 +240,7 @@ int QtAudioCapturer::readAudioData(char* buf, int maxLen)
 void QtAudioCapturer::processAudioData()
 {
     int bufSize = m_buffer.size();
-    qDebug() << "[processAudioData] m_buffer.size()=" << bufSize << ", m_dataBuffer.size()=" << m_dataBuffer.size();
+    // qDebug() << "[processAudioData] m_buffer.size()=" << bufSize << ", m_dataBuffer.size()=" << m_dataBuffer.size();
     // 定时器触发,将m_buffer中的数据转移到m_dataBuffer,以供readAudioData消费
     if (bufSize > 0) {
         QMutexLocker locker(&m_mutex);

+ 17 - 11
AvRecorder/encoder/audio_mixer.cpp

@@ -2,6 +2,7 @@
 
 #include "basic/basic.h"
 #include "basic/frame.h"
+#include "libavutil/error.h"
 
 #include <QDebug>
 
@@ -150,12 +151,18 @@ bool Resampler::Convert(uint8_t* data, int size)
         if (frame.frame == nullptr) {
             break;
         }
-        __CheckBool(swr_convert(_swrCtx,
-                                _swrFrame->data,
-                                _swrFrame->nb_samples,
-                                (const uint8_t**) frame.frame->data,
-                                frame.frame->nb_samples)
-                    > 0);
+        int ret = swr_convert(_swrCtx,
+                              _swrFrame->data,
+                              _swrFrame->nb_samples,
+                              (const uint8_t**) frame.frame->data,
+                              frame.frame->nb_samples);
+        if (ret < 0) {
+            char buffer[AV_ERROR_MAX_STRING_SIZE];
+            av_strerror(ret, buffer, sizeof(buffer));
+            qDebug() << "swr_convert ----------" << ret << QString::fromLatin1(buffer);
+            break;
+        }
+
         _toQueue.Push(_swrFrame->data[0], _swrFrame->linesize[0]);
     }
     return true;
@@ -168,11 +175,10 @@ AVFrame* AudioMixer::Convert(uint32_t index, uint8_t* inBuf, uint32_t size)
     __CheckNullptr(iter != _audioInputInfos.end());
 
     // // 添加调试信息
-    // static int debugCounter = 0;
-    // if (++debugCounter % 100 == 0) {
-    //     qDebug() << "AudioMixer::Convert - Input size:" << size
-    //              << "bytes, Input index: " << index;
-    // }
+    static int debugCounter = 0;
+    if (++debugCounter % 100 == 0) {
+        qDebug() << "AudioMixer::Convert - Input size:" << size << "bytes, Input index: " << index;
+    }
 
     __CheckNullptr(iter->second.resampler->Convert(inBuf, size));
     return _AdjustVolume() ? _outputFrame : nullptr;

+ 10 - 8
AvRecorder/recorder/audio_recorder.cpp

@@ -33,7 +33,7 @@ bool AudioRecorder::Open(const std::vector<AudioCapturer::Type>& deviceTypes,
         if (deviceTypes[index] == AudioCapturer::Type::Speaker) {
             m_audioCapturers.push_back(new WASAPILoopbackCapturer());
         } else {
-            m_audioCapturers.push_back(new WASAPILoopbackCapturer());
+            m_audioCapturers.push_back(new QtAudioCapturer());
         }
     }
 
@@ -136,15 +136,17 @@ void AudioRecorder::PullAndProcessAudio()
         while (true) {
             char buf[1024];
             int bytes = m_audioCapturers[index]->readAudioData(buf, sizeof(buf));
-            if (bytes <= 0) break;
-            
+            static int debugCounter = 0;
+            if (++debugCounter % 100 == 0) { // 每100次打印一次,避免日志过多
+                qDebug() << "Capturer" << index << "read" << bytes << "bytes";
+            }
+            if (bytes <= 0) {
+                break;
+            }
+
             // 添加调试信息,显示数据大小
-            // static int debugCounter = 0;
-            // if (++debugCounter % 100 == 0) { // 每100次打印一次,避免日志过多
-            //     qDebug() << "Capturer" << index << "read" << bytes << "bytes";
-            // }
 
-            auto frame = _mixer.Convert(index, (uint8_t*)buf, bytes);
+            auto frame = _mixer.Convert(index, (uint8_t*) buf, bytes);
             if (frame && _isRecord && _streamIndex != -1) {
                 int frameSize = _mixer.GetOutFrameSize();
                 if (_mixer.GetOutFrameSize() != frameSize) {

+ 6 - 1
AvRecorder/ui/av_recorder.cpp

@@ -332,7 +332,12 @@ void AvRecorder::stopCapture()
 void AvRecorder::renderFrame()
 {
     auto frame = m_videoRecorder.GetRenderFrame();
-    m_glWidget->Render(frame);
+    AVFrame* copiedFrame = av_frame_clone(frame);
+    // m_glWidget->Render(copiedFrame);
+    QMetaObject::invokeMethod(m_glWidget,
+                              "Render",
+                              Qt::QueuedConnection,
+                              Q_ARG(AVFrame*, copiedFrame));
 }
 void AvRecorder::startPreview()
 {

+ 0 - 1
AvRecorder/ui/av_recorder.h

@@ -8,7 +8,6 @@
 #include <QWidget>
 
 #include "audio_widget.h"
-#include "avrecorder/capturer/video/VideoCaptureManager.h"
 #include "qcombobox.h"
 #include "qobjectdefs.h"
 #include "qstatusbar.h"