audio_recorder.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "audio_recorder.h"
  2. #include "capturer/audio/audio_qt_capturer.h"
  3. AudioRecorder::AudioRecorder() {}
  4. AudioRecorder::~AudioRecorder()
  5. {
  6. Close();
  7. }
  8. bool AudioRecorder::Open(const std::vector<AudioCapturer::Type>& deviceTypes,
  9. Encoder<MediaType::AUDIO>::Param& param,
  10. const uint32_t sampleRate,
  11. const uint32_t channels,
  12. const uint32_t bitsPerSample,
  13. const AVSampleFormat format)
  14. {
  15. Close();
  16. Info mixInfo;
  17. mixInfo.mixer = &_mixer;
  18. mixInfo.isRecord = &_isRecord;
  19. mixInfo.streamIndex = &_streamIndex;
  20. // 清空并重新创建音频捕获器
  21. m_audioCapturers.clear();
  22. for (int index = 0; index < deviceTypes.size(); ++index) {
  23. mixInfo.mixIndex = index;
  24. _infos.push_back(mixInfo);
  25. m_audioCapturers.push_back(new QtAudioCapturer());
  26. }
  27. // 初始化每个音频捕获器
  28. for (int index = 0; index < deviceTypes.size(); ++index) {
  29. auto capturer = m_audioCapturers[index];
  30. if (!capturer->Init(deviceTypes[index], _Callback, &(_infos[index]))) {
  31. continue;
  32. }
  33. auto&& format = capturer->GetFormat();
  34. __CheckBool(_mixer.AddAudioInput(index,
  35. format.sampleRate,
  36. format.channels,
  37. format.bitsPerSample,
  38. _GetAVSampleFormat(format.bitsPerSample)));
  39. }
  40. __CheckBool(_mixer.AddAudioOutput(sampleRate, channels, bitsPerSample, format));
  41. _param = param;
  42. __CheckBool(_mixer.SetOutFrameSize(1024));
  43. // 启动所有成功初始化的音频捕获器
  44. for (int index = 0; index < deviceTypes.size(); ++index) {
  45. if (_mixer.GetInputInfo(index) != nullptr) {
  46. __CheckBool(m_audioCapturers[index]->Start());
  47. }
  48. }
  49. return true;
  50. }
  51. void AudioRecorder::Close()
  52. {
  53. StopRecord();
  54. // 停止并释放所有音频捕获器
  55. for (auto capturer : m_audioCapturers) {
  56. if (capturer) {
  57. capturer->Stop();
  58. delete capturer;
  59. }
  60. }
  61. m_audioCapturers.clear();
  62. _mixer.Close();
  63. _infos.clear();
  64. }
  65. void AudioRecorder::SetVolumeScale(float scale, int mixIndex)
  66. {
  67. auto info = _mixer.GetInputInfo(mixIndex);
  68. if (info != nullptr) {
  69. info->scale = scale;
  70. }
  71. }
  72. bool AudioRecorder::LoadMuxer(AvMuxer& muxer)
  73. {
  74. for (auto&& info : _infos) {
  75. info.muxer = &muxer;
  76. }
  77. __CheckBool((_streamIndex = muxer.AddAudioStream(_param)) != -1);
  78. return true;
  79. }
  80. bool AudioRecorder::StartRecord()
  81. {
  82. _isRecord = true;
  83. return true;
  84. }
  85. void AudioRecorder::StopRecord()
  86. {
  87. _isRecord = false;
  88. }
  89. void AudioRecorder::_Callback(void* data, size_t size, void* userInfo)
  90. {
  91. if (!data || size == 0 || !userInfo) {
  92. return;
  93. }
  94. Info* info = static_cast<Info*>(userInfo);
  95. if (!info->mixer || !info->isRecord) {
  96. return;
  97. }
  98. // 添加调试输出
  99. // qDebug() << "AudioRecorder: 收到音频数据,大小:" << size << "字节,混音索引:" << info->mixIndex;
  100. /* auto inputInfo =*/info->mixer->GetInputInfo(info->mixIndex);
  101. auto frame = info->mixer->Convert(info->mixIndex, (uint8_t*) data, size);
  102. if (frame == nullptr) {
  103. return;
  104. }
  105. if (*(info->isRecord)) {
  106. __CheckNo(info->streamIndex && *(info->streamIndex) != -1);
  107. int frameSize = info->muxer->GetCodecCtx(*info->streamIndex)->frame_size;
  108. if (info->mixer->GetOutFrameSize() != frameSize) {
  109. __DebugPrint("Change frame size from %d to %d",
  110. info->mixer->GetOutFrameSize(),
  111. frameSize);
  112. info->mixer->SetOutFrameSize(frameSize);
  113. return;
  114. }
  115. __CheckNo(info->muxer->Write(frame, *(info->streamIndex)));
  116. }
  117. }