|
|
@@ -158,7 +158,6 @@ QtAudioCapturer::~QtAudioCapturer()
|
|
|
bool QtAudioCapturer::Init(Type deviceType)
|
|
|
{
|
|
|
m_deviceType = deviceType;
|
|
|
- setupAudioFormat();
|
|
|
if (m_deviceType == Microphone) {
|
|
|
return initMicrophone();
|
|
|
} else {
|
|
|
@@ -284,76 +283,33 @@ void QtAudioCapturer::onAudioNotify()
|
|
|
|
|
|
bool QtAudioCapturer::initMicrophone()
|
|
|
{
|
|
|
- // 获取默认输入设备
|
|
|
- QAudioDeviceInfo deviceInfo = QAudioDeviceInfo::defaultInputDevice();
|
|
|
-
|
|
|
- qDebug() << "QtAudioCapturer::initMicrophone - 默认输入设备:" << deviceInfo.deviceName();
|
|
|
-
|
|
|
- // 检查设备是否有效
|
|
|
- if (deviceInfo.isNull()) {
|
|
|
- qWarning() << "QtAudioCapturer::initMicrophone - 没有可用的音频输入设备";
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 列出所有可用的音频输入设备
|
|
|
+ qDebug() << "QtAudioCapturer::initMicrophone - 默认输入设备: "
|
|
|
+ << QAudioDeviceInfo::defaultInputDevice().deviceName();
|
|
|
+ QList<QAudioDeviceInfo> availableDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
|
|
qDebug() << "QtAudioCapturer::initMicrophone - 可用的音频输入设备:";
|
|
|
- for (const auto& device : QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) {
|
|
|
- qDebug() << " " << device.deviceName();
|
|
|
+ for (const QAudioDeviceInfo& deviceInfo : availableDevices) {
|
|
|
+ qDebug() << " " << deviceInfo.deviceName();
|
|
|
}
|
|
|
|
|
|
- // 检查格式是否支持
|
|
|
- if (!deviceInfo.isFormatSupported(m_qtAudioFormat)) {
|
|
|
- qWarning() << "QtAudioCapturer::initMicrophone - 默认格式不支持,尝试使用最接近的格式";
|
|
|
-
|
|
|
- // 尝试几种常用格式
|
|
|
- QList<int> sampleRates = {44100, 48000, 16000, 8000};
|
|
|
- QList<int> channelCounts = {2, 1};
|
|
|
- QList<int> sampleSizes = {16, 8};
|
|
|
-
|
|
|
- bool formatFound = false;
|
|
|
-
|
|
|
- for (int rate : sampleRates) {
|
|
|
- for (int channels : channelCounts) {
|
|
|
- for (int size : sampleSizes) {
|
|
|
- QAudioFormat format;
|
|
|
- format.setSampleRate(rate);
|
|
|
- format.setChannelCount(channels);
|
|
|
- format.setSampleSize(size);
|
|
|
- format.setCodec("audio/pcm");
|
|
|
- format.setByteOrder(QAudioFormat::LittleEndian);
|
|
|
- format.setSampleType(QAudioFormat::SignedInt);
|
|
|
-
|
|
|
- if (deviceInfo.isFormatSupported(format)) {
|
|
|
- m_qtAudioFormat = format;
|
|
|
- formatFound = true;
|
|
|
- qDebug() << "QtAudioCapturer::initMicrophone - 找到支持的格式:"
|
|
|
- << "采样率=" << rate << "通道数=" << channels
|
|
|
- << "采样大小=" << size;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (formatFound)
|
|
|
- break;
|
|
|
- }
|
|
|
- if (formatFound)
|
|
|
- break;
|
|
|
- }
|
|
|
+ AudioFormat defaultFormat = IAudioCapturer::GetDefaultFormat();
|
|
|
+ QAudioFormat format;
|
|
|
+ format.setSampleRate(defaultFormat.sampleRate);
|
|
|
+ format.setChannelCount(defaultFormat.channels);
|
|
|
+ format.setSampleSize(defaultFormat.bitsPerSample);
|
|
|
+ format.setCodec("audio/pcm");
|
|
|
+ format.setByteOrder(QAudioFormat::LittleEndian);
|
|
|
+ format.setSampleType(QAudioFormat::SignedInt);
|
|
|
|
|
|
- if (!formatFound) {
|
|
|
- // 使用设备支持的最接近的格式
|
|
|
- m_qtAudioFormat = deviceInfo.nearestFormat(m_qtAudioFormat);
|
|
|
- qDebug() << "QtAudioCapturer::initMicrophone - 使用最接近的格式:"
|
|
|
- << "采样率=" << m_qtAudioFormat.sampleRate()
|
|
|
- << "通道数=" << m_qtAudioFormat.channelCount()
|
|
|
- << "采样大小=" << m_qtAudioFormat.sampleSize();
|
|
|
- }
|
|
|
-
|
|
|
- // 更新 AudioFormat
|
|
|
- m_audioFormat = AudioFormat(m_qtAudioFormat.sampleRate(),
|
|
|
- m_qtAudioFormat.channelCount(),
|
|
|
- m_qtAudioFormat.sampleSize());
|
|
|
+ QAudioDeviceInfo deviceInfo = QAudioDeviceInfo::defaultInputDevice();
|
|
|
+ if (!deviceInfo.isFormatSupported(format)) {
|
|
|
+ qWarning() << "QtAudioCapturer::initMicrophone - 默认格式不支持,尝试使用最接近的格式";
|
|
|
+ format = deviceInfo.nearestFormat(format);
|
|
|
}
|
|
|
|
|
|
+ m_qtAudioFormat = format;
|
|
|
+ m_audioFormat = AudioFormat(m_qtAudioFormat.sampleRate(), m_qtAudioFormat.channelCount(),
|
|
|
+ m_qtAudioFormat.sampleSize());
|
|
|
+
|
|
|
// 创建音频输入
|
|
|
m_audioInput = std::make_unique<QAudioInput>(deviceInfo, m_qtAudioFormat, this);
|
|
|
|
|
|
@@ -372,22 +328,6 @@ bool QtAudioCapturer::initSpeaker()
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void QtAudioCapturer::setupAudioFormat()
|
|
|
-{
|
|
|
- // 设置Qt音频格式
|
|
|
- m_qtAudioFormat.setSampleRate(44100); // 与原代码中的 DEFAULT_SAMPLE_RATE 保持一致
|
|
|
- m_qtAudioFormat.setChannelCount(1); // 改为单声道,提高兼容性
|
|
|
- m_qtAudioFormat.setSampleSize(16); // 与原代码中的 DEFAULT_BITS_PER_SAMPLE 保持一致
|
|
|
- m_qtAudioFormat.setCodec("audio/pcm");
|
|
|
- m_qtAudioFormat.setByteOrder(QAudioFormat::LittleEndian);
|
|
|
- m_qtAudioFormat.setSampleType(QAudioFormat::SignedInt);
|
|
|
-
|
|
|
- // 设置IAudioCapturer使用的格式
|
|
|
- m_audioFormat = AudioFormat(m_qtAudioFormat.sampleRate(),
|
|
|
- m_qtAudioFormat.channelCount(),
|
|
|
- m_qtAudioFormat.sampleSize());
|
|
|
-}
|
|
|
-
|
|
|
float QtAudioCapturer::calculateVolume(const QByteArray& data)
|
|
|
{
|
|
|
// 计算音频数据的音量级别
|