谢谢。就是照这input那个例子写了一个record类。
class record : public QIODevice
{
Q_OBJECT
public:
record(const QAudioFormat &format, QObject *parent);
~record();
void start();
void stop();
qint64 readData(char *data, qint64 maxlen);
qint64 writeData(const char *data, qint64 len);
long int number;
QList<double> listdata;
QList<double> lastdata;
int status; //采样声音的状态:0,没开始;1,已经进入语音;2,结束。
int silence;
private:
const QAudioFormat m_format;
signals:
void update(QList<double> list);
};
record::record(const QAudioFormat &format, QObject *parent)
: QIODevice(parent)
, m_format(format)
, number(0)
, status(0)
, silence(0)
{
}
record::~record(){}
void record::start()
{
open(QIODevice::WriteOnly);
silence=0;
status=0;
}
void record::stop()
{
close();
}
qint64 record::readData(char *data, qint64 maxlen)
{
Q_UNUSED(data)
Q_UNUSED(maxlen)
return 0;
}
qint64 record::writeData(const char *data, qint64 len)
{
//qDebug()<<"write";
QList<double> list;
Q_ASSERT(m_format.sampleSize() % 8 == 0);
const int channelBytes = m_format.sampleSize() / 8;
const int sampleBytes = m_format.channels() * channelBytes;
Q_ASSERT(len % sampleBytes == 0);
const int numSamples = len / sampleBytes; //256Sample
//qWarning()<<"numSamples:"<<numSamples;
const unsigned char *ptr = reinterpret_cast<const unsigned char *>(data);
for (int i = 0; i < numSamples; ++i) {
list << (double)qFromLittleEndian<qint16>(ptr)/32767.0;
//qWarning()<<(double)qFromLittleEndian<qint16>(ptr)/32767.0;
ptr += channelBytes;
number++;
}
emit update(list);
return len;
}
然后,写了一个Dialog类。构造函数里写了如下下东西。
m_format.setFrequency(8000);
m_format.setChannels(1);
m_format.setSampleSize(16);
m_format.setSampleType(QAudioFormat::SignedInt);
m_format.setByteOrder(QAudioFormat::LittleEndian);
m_format.setCodec("audio/pcm");
QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice());
if (!info.isFormatSupported(m_format)) {
qWarning() << "Default format not supported - trying to use nearest";
m_format = info.nearestFormat(m_format);
}
m_audioInfo = new record(m_format, this);
m_audioInput = new QAudioInput(m_device, m_format, this);
m_audioInput->setBufferSize(2560);
m_audioInfo->start();
data_ready = false; //刚开始没有任何数据准备好
connect(this,SIGNAL(recordvoice()),this,SLOT(startRecord()));
mode_states = 0;
connect(modeButton,SIGNAL(clicked()),this,SLOT(modeButonPressed()));
connect(m_audioInfo, SIGNAL(update(QList<double>)),this,SLOT(datareceive(QList<double>)));采样到数据。处理成功发出suc()信号,stopRecording(),
connect(this,SIGNAL(suc()),this,SLOT(stopRecording()));//数据处理成功,发出信号,然后采集下一次数据,
大概就是这样。问题不知道出现在哪里,我在win7的操作系统上可以连续采集N次。但是一到xp操作系统上,进入第二次采集就遇到了上面的情况。