jnny_cn:上代码,这么说也帮不了你什么
(2015-02-03 23:07) 
#ifndef LISTENINGTHREAD_H
#define LISTENINGTHREAD_H
#include <QThread>
#include <QAudioInput>
#include <QIODevice>
#include <QString>
#include <QByteArray>
#include <QTimer>
#define SAMPLE_RATE 96000 //采样率
#define CHANNEL_COUNT 2 //采样通道
#define SAMPLE_SIZE 16 //采样位数
#define RECORDING_TIME 50 //每次采样毫秒数
#define TOTAL_SIZE 384000 //缓存区总大小 Byte
#define USED_SIZE 96000 //缓存区使用大小 Byte
class listeningThread : public QThread
{
Q_OBJECT
public:
explicit listeningThread(QObject *parent = 0);
~listeningThread();
char *buf0Addr() { return buf0->data(); }
char *buf1Addr() { return buf1->data(); }
qint64 buf0Size() { return bytesReaded0; }
qint64 buf1Size() { return bytesReaded1; }
bool listeningBufFlag() { return bufFlag; }
protected:
void run();
signals:
void addLog(QString newLog, int flag);
void buf0Full(char *buf0Address, qint64 buf0Size);
void buf1Full(char *buf1Address, qint64 buf1Size);
public slots:
void readAudioData();
private:
QAudioInput *audioInput;
QIODevice *ioDeviceAudioIn;
QTimer *timer;
QByteArray *buf0;
QByteArray *buf1;
bool bufFlag;
qint64 bytesReaded0;
qint64 bytesReaded1;
};
#endif // LISTENINGTHREAD_H
#include "listeningthread.h"
#include <QDebug>
#include <QTime>
listeningThread::listeningThread(QObject *parent) :
QThread(parent)
{
}
listeningThread::~listeningThread()
{
audioInput->stop();
delete audioInput;
delete ioDeviceAudioIn;
delete timer;
delete buf0;
delete buf1;
}
void listeningThread::run()
{
buf0 = new QByteArray();
buf1 = new QByteArray();
buf0->resize(TOTAL_SIZE);
buf1->resize(TOTAL_SIZE);
bufFlag = false;
bytesReaded0 = 0;
bytesReaded1 = 0;
QAudioFormat format;
format.setSampleRate(SAMPLE_RATE);
format.setChannelCount(CHANNEL_COUNT);
format.setSampleSize(SAMPLE_SIZE);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format))
{
emit addLog("Listening default format not supported!",0);
return;
}
audioInput = new QAudioInput(format); //read audio data
audioInput->setBufferSize(SAMPLE_RATE / 1000 * SAMPLE_SIZE / 8 * CHANNEL_COUNT * RECORDING_TIME * 3);
timer = new QTimer();
connect(timer,SIGNAL(timeout()),this,SLOT(readAudioData()));
ioDeviceAudioIn = audioInput->start();
timer->start(RECORDING_TIME);
emit addLog("监听线程打开", 0);
exec();
}
void listeningThread::readAudioData()
{
while(audioInput->bytesReady())
{
// qDebug()<<audioInput->bytesReady()<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
qint64 bytesReady = audioInput->bytesReady();
if(bufFlag)
{
bytesReaded1 += ioDeviceAudioIn->read((buf1->data() + bytesReaded1), bytesReady);
if(bytesReaded1 >= USED_SIZE)
{
emit buf1Full(buf1->data(), bytesReaded1);
bytesReaded0 = 0;
bufFlag = !bufFlag;
// qDebug()<<"buf0"<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
}
}
else
{
bytesReaded0 += ioDeviceAudioIn->read((buf0->data() + bytesReaded0), bytesReady);
if(bytesReaded0 >= USED_SIZE)
{
emit buf0Full(buf0->data(), bytesReaded0);
bytesReaded1 = 0;
bufFlag = !bufFlag;
// qDebug()<<"buf1"<<' '<<QTime::currentTime().toString("hh:mm:ss.zzz");
}
}
}
}
运行30分钟左右进入readAudioData()函数便不在执行了