从QAudioBuffer填充QByteArray

时间:2016-06-01 19:17:02

标签: c++ qt qt5 qbytearray qaudiorecorder

我的目标是将QAudioRecorder录音保存到内存中。根据我的研究,似乎存储录音的最佳方式是使用QByteArray。我的录音机使用QAudioProbe进行探测。

audioBufferProbed信号我尝试使用这个插槽方法将数据附加到字节数组。

QByteArray *byteArr;

void AudioRecorder::processBuffer(const QAudioBuffer &buffer)
{
    byteArr->append(buffer.constData<char>());
    qDebug() << buffer.byteCount();
    qDebug() << byteArr->size();
}

然而,考虑到buffer.byteCount();不断返回4092看似正常,但byteArr->size();返回奇怪且不规则的增量通常从2,4,6,7,189开始,这似乎不起作用。

数据通常最终只有大约18kb,这也让我相信数据没有正确地附加到字节数组中。

根据QByteArray::size()文档size()应该给出数组中有多少字节。与QAudioBuffer::byteCount()同时也应该给出当前缓冲区中的字节数,不应该将缓冲区中的完整4092复制到数组中吗?

如果有更好的方法来存储数据,我也会对另一个不使用QByteArray的解决方案持开放态度。

2 个答案:

答案 0 :(得分:3)

你有一个QByteArray指针,但没有把它设置为任何东西。

您需要将其设置为QByteArray,在您的情况下,您可以使用QByteArray(const char * data, int size)

byteArr = new QByteArray(buffer.constData<char>(), buffer.byteCount());

但说实话,我不确定你为什么要使用指针。

你可以这样做:

QByteArray byteArr; // Your global declaration 
   :
   :
byteArr.append(buffer.constData<char>(), buffer.byteCount());

如果您使用的是二进制数据,则可能需要尝试这样打印...:

qDebug() << byteArr.toHex();

答案 1 :(得分:2)

您使用的方法QByteArray::append除了您的预期之外还有其他功能。附加的重载你使用追加字节直到遇到零。这个API应该用于c-strings!

所以修复这样的代码:

QByteArray byteArr; // there is no point of create this on heap
byteArr.reserve(8*1024*1024); // reserve 8 MB - it will improve performance

void AudioRecorder::processBuffer(const QAudioBuffer &buffer)
{
    byteArr.append(buffer.constData<char>(), buffer.size());
    qDebug() << buffer.byteCount();
    qDebug() << byteArr.size();
}