• 11794阅读
  • 5回复

为什么第二次QAudioinput不能采集声音数据? [复制链接]

上一主题 下一主题
离线cdutherbert
 
只看楼主 倒序阅读 楼主  发表于: 2010-07-22
程序如下:下面两个都是槽函数。
void Dialog::startRecord()
{
    qDebug()<<"start";
    data_ready = false;//数据没有准备好
  /*将m_audioInfo的所有值都初始化,以便下次继续录音*/
    m_audioInfo->listdata.clear();
    m_audioInfo->number=0;
    m_audioInfo->silence=0;
    m_audioInfo->status = 0;
    m_audioInfo->lastdata.clear();
    qDebug()<<"start state="<<m_audioInput->state();
    m_audioInput->start(m_audioInfo);//开始录音    
qDebug()<<"start state="<<m_audioInput->state();

}
void Dialog::stopRecording()
{
    qDebug()<<"stop";
     /*停止录音*/
    m_audioInput->stop();
    //qDebug()<<"datasize:"<<m_audioInfo->listdata.size();

     data_ready = true;
    qDebug()<<"data_ready "<<data_ready;    
     emit recordvoice();//发出信号,继续调用startrecord()录取下一个音。
}

程序第一次用button发出信号,调用startrecord 可以采集到声音,但是发出信号recordvoice()第二次调用startRecord(),
控制台显示
start
start state= 2
start state= 0
说明,已经进入槽函数startRecord(),为什么第二次没有数据采集到。不能得到数据?
谢谢
        
离线xtfllbl

只看该作者 1楼 发表于: 2010-07-22
enum QAudio::State
ConstantValueDescription
QAudio::ActiveState0Audio data is being processed, this state is set after start() is called and while audio data is available to be processed.
QAudio::SuspendedState1The audio device is in a suspended state, this state will only be entered after suspend() is called.
QAudio::StoppedState2The audio device is closed, not processing any audio data
QAudio::IdleState3The QIODevice passed in has no data and audio system's buffer is empty, this state is set after start() is called and while no audio data is available to be processed.


状态2到0的情况正常,不能取得数据另有原因。也许是你文件那部分的问题,没贴出来,不好判断。

看看
QAudio::Error QAudioInput::error () const

有没返回什么东西。

上海欢迎您
离线cdutherbert
只看该作者 2楼 发表于: 2010-07-22
谢谢。就是照这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操作系统上,进入第二次采集就遇到了上面的情况。


离线xtfllbl

只看该作者 3楼 发表于: 2010-07-22
怎么又牵扯到操作系统上来了,那估计和声卡驱动有点关系了,不知道qt底层如何调用设备的。
上海欢迎您
离线cdutherbert
只看该作者 4楼 发表于: 2010-07-22
哎。郁闷。这个东西,写了这些程序还头一回遇到这个问题。
离线guoke204

只看该作者 5楼 发表于: 2012-02-28
qt除了界面以外,其它实在没有什么优势,写代码的很痛苦,我现在也在为声音这块纠结
快速回复
限100 字节
 
上一个 下一个