#include #include "Logs/loginit.h" #include "bundled/core.h" #include "spdlog/spdlog.h" #include "AudioRecord.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); init_log(); SPDLOG_INFO("********** RecordAudio **********"); std::list audioDevices; getAudioDevices(audioDevices); SPDLOG_INFO("可用的声卡设备:"); for (const auto &device : audioDevices) { SPDLOG_INFO("声卡编号: {}, ID: {}, 名称: {}, 驱动: {}, 长名称: {}, 混音器名称: {}, 组件信息: {}", device.CardNumber, device.CardID, device.CardName, device.CardDriver, device.CardLongName, device.CardMixername, device.CardComponents); for (const auto &pcmDevice : device.PCMDevices) { SPDLOG_INFO(" PCM设备编号: {}, 子设备编号: {}, 声卡ID: {}, 名称: {}, 子设备名称: {}", pcmDevice.PCMDevice, pcmDevice.SubDevice, pcmDevice.PCMID, pcmDevice.PCMName, pcmDevice.PCMSubName); } } SPDLOG_INFO("********** 获取声卡设备列表完成 **********"); std::list audioDeviceDescs; getPCMAudioDevice(audioDeviceDescs); SPDLOG_INFO("可用的声卡字符设备:"); for (const auto &deviceDesc : audioDeviceDescs) { SPDLOG_INFO("设备名称: {}, 描述: {}, IOID: {}, 声卡: {}, 设备编号: {}", deviceDesc.DeviceName, deviceDesc.DeviceDesc, deviceDesc.IOID, deviceDesc.Card, deviceDesc.DevNum); } SPDLOG_INFO("********** 获取声卡字符设备列表完成 **********"); AudioRecord audioRecord; std::string deviceName = fmt::format("hw:{},{}", audioDevices.front().CardNumber, audioDevices.front().PCMDevices.front().PCMDevice); audioRecord.setRecordParams(44100, 16, 2); // 设置采样率为44100Hz,16位深度,2通道 if (!audioRecord.openRecordChannel(deviceName)) { SPDLOG_ERROR("无法打开音频通道: {}", deviceName); return -1; } std::ofstream outFile("recorded_audio.raw", std::ios::binary | std::ios::out | std::ios::trunc); if (!outFile.is_open()) { SPDLOG_ERROR("无法打开输出文件: recorded_audio.raw"); return -1; } for(int i = 0; i < 10; ++i) { // 录制10秒 char buffer[44100 * 2 * 2]; // 1秒的缓冲区大小,44100帧 * 2通道 * 2字节 int bytesRead = audioRecord.recordAudio(buffer, sizeof(buffer), 44100); if (bytesRead < 0) { SPDLOG_ERROR("录音失败"); outFile.close(); return -1; } outFile.write(buffer, bytesRead); SPDLOG_INFO("已录制 {} 秒音频", i + 1); } outFile.close(); SPDLOG_INFO("录音完成,音频数据已保存到 recorded_audio.raw"); return a.exec(); }