main.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <QApplication>
  2. #include "Logs/loginit.h"
  3. #include "bundled/core.h"
  4. #include "spdlog/spdlog.h"
  5. #include "AudioRecord.h"
  6. #include <fstream>
  7. int main(int argc, char *argv[])
  8. {
  9. QApplication a(argc, argv);
  10. init_log();
  11. SPDLOG_INFO("********** RecordAudio **********");
  12. std::list<AudioDevice_t> audioDevices;
  13. getAudioDevices(audioDevices);
  14. SPDLOG_INFO("可用的声卡设备:");
  15. for (const auto &device : audioDevices) {
  16. SPDLOG_INFO("声卡编号: {}, ID: {}, 名称: {}, 驱动: {}, 长名称: {}, 混音器名称: {}, 组件信息: {}",
  17. device.CardNumber, device.CardID, device.CardName, device.CardDriver,
  18. device.CardLongName, device.CardMixername, device.CardComponents);
  19. for (const auto &pcmDevice : device.PCMDevices) {
  20. SPDLOG_INFO(" PCM设备编号: {}, 子设备编号: {}, 声卡ID: {}, 名称: {}, 子设备名称: {}",
  21. pcmDevice.PCMDevice, pcmDevice.SubDevice, pcmDevice.PCMID,
  22. pcmDevice.PCMName, pcmDevice.PCMSubName);
  23. }
  24. }
  25. SPDLOG_INFO("********** 获取声卡设备列表完成 **********");
  26. std::list<AudioDeviceDesc_t> audioDeviceDescs;
  27. getPCMAudioDevice(audioDeviceDescs);
  28. SPDLOG_INFO("可用的声卡字符设备:");
  29. for (const auto &deviceDesc : audioDeviceDescs) {
  30. SPDLOG_INFO("设备名称: {}, 描述: {}, IOID: {}, 声卡: {}, 设备编号: {}",
  31. deviceDesc.DeviceName, deviceDesc.DeviceDesc,
  32. deviceDesc.IOID, deviceDesc.Card, deviceDesc.DevNum);
  33. }
  34. SPDLOG_INFO("********** 获取声卡字符设备列表完成 **********");
  35. AudioRecord audioRecord;
  36. std::string deviceName = fmt::format("hw:{},{}", audioDevices.front().CardNumber, audioDevices.front().PCMDevices.front().PCMDevice);
  37. audioRecord.setRecordParams(44100, 16, 2); // 设置采样率为44100Hz,16位深度,2通道
  38. if (!audioRecord.openRecordChannel(deviceName)) {
  39. SPDLOG_ERROR("无法打开音频通道: {}", deviceName);
  40. return -1;
  41. }
  42. std::ofstream outFile("recorded_audio.raw", std::ios::binary | std::ios::out | std::ios::trunc);
  43. if (!outFile.is_open()) {
  44. SPDLOG_ERROR("无法打开输出文件: recorded_audio.raw");
  45. return -1;
  46. }
  47. for(int i = 0; i < 10; ++i) { // 录制10秒
  48. char buffer[44100 * 2 * 2]; // 1秒的缓冲区大小,44100帧 * 2通道 * 2字节
  49. int bytesRead = audioRecord.recordAudio(buffer, sizeof(buffer), 44100);
  50. if (bytesRead < 0) {
  51. SPDLOG_ERROR("录音失败");
  52. outFile.close();
  53. return -1;
  54. }
  55. outFile.write(buffer, bytesRead);
  56. SPDLOG_INFO("已录制 {} 秒音频", i + 1);
  57. }
  58. outFile.close();
  59. SPDLOG_INFO("录音完成,音频数据已保存到 recorded_audio.raw");
  60. return a.exec();
  61. }