【问题标题】:Fill QByteArray from QAudioBuffer从 QAudioBuffer 填充 QByteArray
【发布时间】:2016-10-01 07:34:51
【问题描述】:

我的目标是将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-&gt;size(); 返回奇怪且不规则的增量,通常从 2、4、6、7、189 开始,这似乎不起作用。

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

根据QByteArray::size() 文档size() 应该给出数组中有多少字节。除了QAudioBuffer::byteCount(),它还应该给出当前缓冲区中的字节数,不应该将缓冲区中的完整 4092 复制到数组中吗?

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

【问题讨论】:

    标签: c++ qt qt5 qbytearray qaudiorecorder


    【解决方案1】:

    您有一个 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 哦,是的,对不起....size() 是 QByteArray,我的错误:p
    【解决方案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();
    }
    

    【讨论】:

    • appends bytes until zero is encountered - 你确定吗?我附近没有我的开发 PC,但我总是使用 QByteArray 处理二进制数据,我不记得附加二进制数据(即非 ASCII 字符串)有任何问题......
    • 是的。您正在使用此重载:QByteArray::append(const char * str),这是从 ANSI C 字符串继承的标准行为。
    • 好吧...我刚刚做了一个qt项目测试。我创建了一个 char[10] 数组并将值设置为 '0', '1', '2', (char) 0x00, '0', '1', '2', (char) 0x00,然后使用附加 ba.append(&amp;arr[0], 8),它工作正常...... QByteArray 不仅适用于 ANSI C 字符串......它适用于“字节”跨度>
    • 对 Qt 文档的另一篇阅读表明,此重载会按照用户指定的方式进行计数。如果 count 是 -1 它使用 qstrlen() 来确定大小 - 我假设 QByteArray::append(const char * str) 也是如此......所以看起来你可以按原样使用它
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2015-06-26
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多