C ++ Qt QAudioInput + QIODevice

Моя цель — захватывать звук с микрофона и воспроизводить в реальном времени. Проблема в том, что когда я нажимаю кнопку «Пуск», в выходных данных приложения появляется несколько сообщений, таких как QAudioInput: IOError, невозможно записать в QIODevice.
Я смотрел на примере «qaudioinput».
При комментировании каждой строки я обнаружил, что проблема в линии
audioInput-> начать (devInput);
когда следующая строка
audioOutput-> начать (devOutput);
работает нормально.
И еще, кто-нибудь может объяснить про режимы push и pull в примере qaudioinput? В интернете нет информации об этом.

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QDialog>
#include <QHBoxLayout>
#include <QPushButton>
#include <QtMultimedia/QAudioFormat>
#include <QtMultimedia/QAudioInput>
#include <QtMultimedia/QAudioOutput>
#include <QByteArray>
#include <QIODevice>

class audioIn : public QIODevice
{
Q_OBJECT
public:
audioIn(const QAudioFormat &format, QObject *parent);
~audioIn();
qint64 writeData(const char *data, qint64 len);
qint64 readData(char *data, qint64 maxlen);
void start();
void stop();
private:
const QAudioFormat m_format;
};
class audioOut : public QIODevice
{
Q_OBJECT
public:
audioOut(const QAudioFormat &format, QObject *parent);
~audioOut();
qint64 writeData(const char *data, qint64 len);
qint64 readData(char *data, qint64 maxlen);
void start();
void stop();
private:
const QAudioFormat m_format;
};

class mainwindow:public QDialog
{
Q_OBJECT
public:
mainwindow(QWidget *parent = 0);
~mainwindow();
private:
QHBoxLayout* layout;
QPushButton* start;
QByteArray buffer;
QAudioFormat m_format;
QAudioInput* audioInput;
QAudioOutput* audioOutput;
audioIn* devInput;
audioOut* devOutput;
QIODevice* m_input;
QIODevice* m_output;

public slots:
void startrec();
void readMore();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
audioIn::audioIn(const QAudioFormat &format, QObject *parent):QIODevice(parent), m_format(format)
{

}
audioIn::~audioIn()
{
}
void audioIn::start()
{
open(QIODevice::WriteOnly);
}
void audioIn::stop()
{
close();
}
qint64 audioIn::readData(char *data, qint64 maxlen)
{
Q_UNUSED(data);
Q_UNUSED(maxlen);
return 0;
}
qint64 audioIn::writeData(const char *data, qint64 len)
{
Q_UNUSED(data);
Q_UNUSED(len);
return 0;
}

audioOut::audioOut(const QAudioFormat &format, QObject *parent):QIODevice(parent), m_format(format)
{

}
audioOut::~audioOut()
{
}
void audioOut::start()
{
open(QIODevice::ReadOnly);
}
void audioOut::stop()
{
close();
}
qint64 audioOut::readData(char *data, qint64 maxlen)
{
Q_UNUSED(data);
Q_UNUSED(maxlen);
return 0;
}
qint64 audioOut::writeData(const char *data, qint64 len)
{
Q_UNUSED(data);
Q_UNUSED(len);
return 0;
}

mainwindow::mainwindow(QWidget *parent): QDialog(parent)
{
layout = new QHBoxLayout;
start = new QPushButton("Start");
layout->addWidget(start);
setLayout(layout);
connect(start, SIGNAL(clicked(bool)), this, SLOT(startrec()));
}
mainwindow::~mainwindow()
{

}

void mainwindow::startrec()
{
m_format.setByteOrder(QAudioFormat::LittleEndian);
m_format.setChannelCount(2);
m_format.setSampleRate(44100);
m_format.setSampleSize(16);
m_format.setCodec("audio/pcm");
m_format.setSampleType(QAudioFormat::UnSignedInt);

QAudioDeviceInfo infoIn(QAudioDeviceInfo::defaultInputDevice());
if(!infoIn.isFormatSupported(m_format))
m_format = infoIn.nearestFormat(m_format);
devInput = new audioIn(m_format, this);
audioInput = new QAudioInput(infoIn, m_format, this);

QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice());
if(!infoOut.isFormatSupported(m_format))
m_format = infoOut.nearestFormat(m_format);
devOutput = new audioOut(m_format, this);
audioOutput = new QAudioOutput(infoOut,m_format, this);

devInput->start();
devOutput->start();
m_input = audioInput->start();
m_output = audioOutput->start();

connect(m_input, SIGNAL(readyRead()), SLOT(readMore()));
}

void mainwindow::readMore()
{
qint64 len = audioInput->bytesReady();
if(len > 7056)
len = 7056;
qint64 l = m_input->read(buffer.data(), len);
if(l > 0)
m_output->write(buffer.constData(), l);
}

0

Решение

Это ваша проблема:

void audioIn::start()
{
open(QIODevice::WriteOnly);
}

Если хотите читать с устройства лучше открыть его в режиме ReadOnly или ReadWrite ….

(очевидно, ваш класс audioIn должен читать данные, а не писать).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]