3

我的目标是将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如果有更好的方法来存储数据,我也愿意接受另一种不使用的解决方案。

4

2 回答 2

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();
于 2016-06-01T19:52:33.683 回答
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();
}
于 2016-06-01T19:48:28.337 回答