QtAudioOutput запись в файл

Я хочу получать данные из опеределённого аудиопотока и складывать их в файл .raw Почему-то всегда outputSource.state() = QAudio::IdleState, хотя я подаю аудиосигнал сигнал на данный поток. Соответственно файл пуст. main.cpp

#include <QCoreApplication>
#include <QTextStream>
#include <QAudioOutput>
#include <QAudioDeviceInfo>
#include <QByteArray>
#include <QFile>
#include <QIODevice>

QTextStream cout(stdout);
QTextStream cin(stdin);

void getAudioDevicesList()
{
//    cout << "Input: " << endl;
//    const auto inputDeviceInforms = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
//    for (const QAudioDeviceInfo &deviceInfo : inputDeviceInforms)
//        cout << "Device name: " << deviceInfo.deviceName() << endl;

    cout << "Output: " << endl;
    const auto outputDeviceInforms = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
    int outputAmount = 0;
    for (const QAudioDeviceInfo &deviceInfo : outputDeviceInforms)
        cout << ++outputAmount << ". "<< deviceInfo.deviceName() << endl;

//    int index = 0;
//    cout << "Please write index of prefered output device: ";
//    cin >> index;

    cout << endl;
}

int main(int argc, char *argv[])
{
    getAudioDevicesList();
    QFile destinationFile;
    destinationFile.setFileName("C:/Users/Kirill Pukhov/OneDrive/Desktop/test.raw");
    destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate);

    QAudioDeviceInfo outputDeviceInfo(QAudioDeviceInfo::availableDevices(QAudio::AudioOutput).takeAt(0));
    cout << "Output device: " << outputDeviceInfo.deviceName() << endl;

    QAudioFormat outputFormat;
    outputFormat.setSampleRate(44100);
    outputFormat.setSampleType(QAudioFormat::SignedInt);
    outputFormat.setByteOrder(QAudioFormat::LittleEndian);
    outputFormat.setSampleSize(16);
    outputFormat.setChannelCount(2);
    outputFormat.setCodec("audio/pcm");

    QAudioOutput outputSource(outputDeviceInfo, outputFormat);
    outputSource.setBufferSize(outputFormat.sampleSize() * outputFormat.channelCount() * 1024);
    QIODevice *outputDevice = outputSource.start();
    outputDevice->open(QIODevice::ReadOnly);
    destinationFile.write(static_cast<char *>(outputDevice->peek(outputFormat.sampleSize() * outputFormat.channelCount() * 1024).data()));

    cout << endl;
    return 0;
}

Это тестовый код, т.к. я ещё только учусь работать с аудио в Qt Мне кажется, что я что-то с самого начала начал что-то не так делать, т.к. немного не понимаю точно как работают эти классы.


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Пожалуй стоит начать с того что QAudioOutput предназначен для ВЫВОДА

The QAudioOutput class provides an interface for sending audio data to an audio output device

Вам нужен QAudioInput

The QAudioInput class provides an interface for receiving audio data from an audio input device.

Пример его использования можно посмотреть тут: https://doc.qt.io/qt-5/qtmultimedia-multimedia-audioinput-example.html

→ Ссылка