求大神指点QAudioOutput问题

lifang303166 2013-08-07 07:27:38
QAudioOutput *m_audioOutput;
RepletQIODevice *m_audioListenFile;
m_audioOutput->start(m_audioListenFile);


RepletQIODevice是我继承QFile创建一个新类,在这个类里面,我重现了readData(char *data, qint64 maxlen),让它读取我给它的数据来播放。memcpy(data, listenArray.left(maxlen).data(), maxlen);
但是当我没有数据给data参数的时候,只要我调用m_audioOutput->stop(); 程序就会崩溃。求各位大虾指点迷津。
...全文
323 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyz769109884 2014-12-15
  • 打赏
  • 举报
回复
你好,我想问下,我start以后,进入不了你重新实现的readData函数呢,能不能指点一下,谢谢!
sgyaaron 2014-05-15
  • 打赏
  • 举报
回复
楼主代码可留着
lifang303166 2013-08-19
  • 打赏
  • 举报
回复
问题总算是解决了,根本就没有什么头不头的,只是一个参数的设置。 QAudioFormat format; format.setSampleRate(8000); format.setChannels(1); format.setSampleSize(16); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); 我之前用的是BigEndian
lifang303166 2013-08-17
  • 打赏
  • 举报
回复
引用 1 楼 xucong198949 的回复:
把相关实现发上来看看吧
我知道了,问题不在我的这些代码,可能是那个文件头的关系。请问一下,当我使用QAudioInput录音时,保存下来的文件有没有文件头?如果有,会是什么样的结构体?
lifang303166 2013-08-15
  • 打赏
  • 举报
回复
QAudioOutput  *m_audioOutput;
RepletQIODevice  *m_audioListenFile;
这是我重新实现的readData函数。
qint64 RepletQIODevice::readData(char *data, qint64 maxlen)
{
    memset(data, 0, maxlen);
    m_mutex.lock();
    if (listenArray.size() < maxlen) {
        maxlen = listenArray.size();
    }
    if (maxlen > 0) {
        memcpy(data, listenArray.left(maxlen).data(), maxlen);
        listenArray.remove(0, maxlen);
    }
    m_mutex.unlock();
    return maxlen;
}
下面是我自己的音频数据的回调,会不断的有音频数据过来。
int Widget::AudioDataCallBack(char *pDataBuf, int nSize)
{
    if (m_audioOutput != NULL && m_audioOutput->state() != QAudio::StoppedState) {
        m_audioListenFile->listenWriteData(pDataBuf, nSize);
    }
}
每次过来的数据,我都追加到listenArray
int RepletQIODevice::listenWriteData(const char *data, qint64 maxlen)
{
    m_mutex.lock();
    listenArray.append(data, maxlen);
    m_mutex.unlock();
}
void Widget::startListen()
{
    QAudioFormat format;
    format.setSampleRate(8000);
    format.setChannels(1);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::BigEndian);
    format.setSampleType(QAudioFormat::SignedInt);
    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
    if (!info.isFormatSupported(format)) {
        format = info.nearestFormat(format);
    }

    if (m_audioOutput == NULL) {
        m_audioOutput = new QAudioOutput(format, this);
        m_audioOutput->setBufferSize(640);
    }

    if (m_audioListenFile == NULL) {
        m_audioListenFile = new RepletQIODevice( "mylisten");
        m_audioListenFile->open(QIODevice::ReadOnly);
    }
    m_audioOutput->start(m_audioListenFile);
}
void Widget::stopListen()
{
    if (m_audioOutput != NULL) {
        if (m_audioOutput->state() != QAudio::StoppedState) {
            m_audioOutput->stop();//若这时候回调是没有数据过来的话,即listenArray的数据长度为0时,程序就会死掉。。。
        }
        delete m_audioOutput;
        m_audioOutput = NULL;
    }

    if (m_audioListenFile != NULL) {
        listenArray.clear();
        m_audioListenFile->close();
        delete m_audioListenFile;
        m_audioListenFile = NULL;
    }
}
xucong198949 2013-08-08
  • 打赏
  • 举报
回复
把相关实现发上来看看吧

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧