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()函数便不在执行了