我的目标是将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
的解决方案持开放态度。
答案 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();
}