从 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();
我的目标是将 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();