Я использую QAudioInput для записи звука с системного устройства ввода по умолчанию. Я получаю обратный вызов из QIODevice :: readyRead, что байты готовы для чтения, но чтение байтов возвращает массив \ 0, равный размеру audioInput-> bytesReady ().
Что такое Я делаю неправильно здесь, и я не могу получить фактические байты, записанные с устройства?
Это полный код:
file main. cpp
#include "mainwindow.h"
#include "audiorecorder.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
AudioRecorder recorder;
recorder.startRecording();
return a.exec();
}
file audiorecorder.h
#ifndef AUDIORECORDER_H
#define AUDIORECORDER_H
#include <QObject>
#include <QAudioInput>
class AudioRecorder : public QObject
{
Q_OBJECT
public:
explicit AudioRecorder(QObject *parent = nullptr);
void startRecording();
private:
QAudioInput *audioInput;
QAudioDeviceInfo deviceInfo;
QAudioFormat format;
QIODevice *iodevice;
QAudioDeviceInfo devInfo;
void onReadyRead();
signals:
};
#endif // AUDIORECORDER_H
файл аудиорекордера. cpp
#include "audiorecorder.h"
#include <iostream>
AudioRecorder::AudioRecorder(QObject *parent) : QObject(parent)
{
}
void AudioRecorder::startRecording()
{
deviceInfo = deviceInfo.defaultInputDevice();
std::cout << deviceInfo.deviceName().toStdString() << std::endl;
format = deviceInfo.preferredFormat();
format.setSampleRate(44100);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
if (!deviceInfo.isFormatSupported(format)) {
std::cout << "raw audio format not supported by backend, finding closest alternative." << std::endl;
format = deviceInfo.nearestFormat(format);
}
audioInput = new QAudioInput(deviceInfo, format, this);
iodevice = audioInput->start();
QObject::connect(AudioRecorder::iodevice, &QIODevice::readyRead, this, &AudioRecorder::onReadyRead);
}
void AudioRecorder::onReadyRead()
{
QByteArray buffer;
auto bytesReady = audioInput->bytesReady();
std::cout << "bytesReady: " << bytesReady << std::endl;
buffer.resize(bytesReady);
//buffer.fill(0);
auto ret = iodevice->read(buffer.data(), bytesReady);
std::cout << "bytes read: " << ret << std::endl;
}
Я загрузил полный код проекта здесь: https://www.sendspace.com/file/99dlei