从QAudioBuffer填充QByteArray

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的解决方案。

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

这个可行,尽管我不得不使用 buffer.byteCount();。对不起,我应该提到字节数组已经初始化了。指针只是用于测试。 - Alex
@Alex 哦,对了,抱歉... .size() 是 QByteArray,是我的错误 :p - code_fodder

2

您正在使用方法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处理二进制数据,我不记得在追加二进制数据(即非ASCII字符串)方面有任何问题... - code_fodder
是的。您正在使用此重载:QByteArray::append(const char * str),这是从ANSI C字符串继承的标准行为。 - Marek R
嗯...我刚刚做了一个qt项目测试。我创建了一个char[10]数组,并将值设置为'0','1','2',(char) 0x00,'0','1','2',(char) 0x00,然后使用了append ba.append(&arr[0], 8),它运行得很好... QByteArray不仅适用于ANSI C-Strings...它适用于“字节”。 - code_fodder
1
再次阅读Qt文档后,我发现这个重载函数会按照用户指定的计数进行计算。如果计数为-1,则使用qstrlen()来确定大小 - 我认为QByteArray :: append(const char * str)也是如此...所以看起来你可以直接使用它。 - code_fodder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接