从 QAudioBuffer 填充 QByteArray

Fill QByteArray from QAudioBuffer

我的目标是将 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(); returns 4092 似乎正常但 byteArr->size(); returns 奇怪和不规则的增量通常从 2 开始,这似乎不起作用, 4, 6, 7, 189.

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

根据 QByteArray::size() docs size() should give how many bytes are in the array. Along with QAudioBuffer::byteCount() 也应该给出当前缓冲区中的字节数,难道不应该将缓冲区中的完整 4092 复制到数组中吗?

如果有更好的数据存储方式,我也愿意接受另一种不使用 QByteArray 的解决方案。

您使用的方法 QByteArray::append 执行的操作超出您的预期。您正在使用的这种追加重载追加字节,直到遇到零。这个 API 应该用于 C 字符串!

所以像这样修改代码:

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();
}

您有一个 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());

如果您使用的是二进制数据,您可能想尝试这样打印...:[=​​14=]

qDebug() << byteArr.toHex();