Невозможно прочитать байты во время записи аудио с использованием QAudioInput - PullRequest
2 голосов
/ 25 апреля 2020

Я использую 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

...