Last Audio QueueBuffer 有夸大的量级

Posted

技术标签:

【中文标题】Last Audio QueueBuffer 有夸大的量级【英文标题】:Last AudioQueueBuffer has exagerated magnitudes 【发布时间】:2014-04-27 17:59:24 【问题描述】:

解决这个问题的人必须拥有福尔摩斯奖杯。就这样吧。

我正在使用 AudioQueues 录制声音(LPCM、SInt16、4 个缓冲区) 在回调中,我尝试通过将样本转换为浮点数并使用 vDSP_meamgv 来测量平均幅度。以下是一些示例方法:

Mean, No of samples
44.400364, 44100
36.077393, 44100
27.672422, 41984
2889.821289, 44100
57.481972, 44100
58.967506, 42872
54.691631, 44100
2894.467285, 44100
62.697800, 42872
63.732948, 44100
66.575623, 44100
2979.566406, 42872

如您所见,每四个(最后一个)缓冲区都是野生的。我查看了单独的样本,有很多 0 和很多巨大的数字,没有正常的数字,就像其他缓冲区一样。事情变得更有趣了。如果我改用 3 个缓冲区,则第三个(总是最后一个)是柏忌。这适用于我选择的任意数量的缓冲区。

我在回调中放了一个 if 以不将野生缓冲区排入队列,一旦它消失,就没有更多的大数字,其他缓冲区继续正常填充。我放了一个按钮,在这个队列被丢弃后重新入队,一旦我重新入队,它就会再次被巨大的样本(即那个缓冲区!)填满。

现在是樱桃 - 我将我的代码用于计算其他项目的平均值,例如 Apple 的 SpeakHere,同样的事情也发生在 o.O 中,尽管该应用程序运行良好,可以记录和播放记录的内容。

我只是不明白,我已经绞尽脑汁想弄清楚这一点。如果有人有线索...

如果有帮助,这里是回调:

void Recorder::MyInputBufferHandler(void *                             inUserData,
                                    AudioQueueRef                          inAQ,
                                    AudioQueueBufferRef                    inBuffer,
                                    const AudioTimeStamp *                 inStartTime,
                                    UInt32                                 inNumPackets,
                                    const AudiostreamPacketDescription*    inPacketDesc) 
    Recorder* eu = (Recorder*)inUserData;

    vDSP_vflt16((SInt16*)inBuffer->mAudioData, 1, eu->conveier, 1, inBuffer->mAudioDataByteSize);
    float mean;
    vDSP_meamgv(eu->conveier, 1, &mean, inBuffer->mAudioDataByteSize);
    printf("values: %f, %d\n",mean,inBuffer->mAudioDataByteSize); 
//    if (mean<2300)
        AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);

'conveier' 是我预先分配的浮点数组。

【问题讨论】:

【参考方案1】:

获得奖杯的也是我。错误在于 vDSP 函数不应该获得 mAudioDataByteSize 参数,因为它们需要数组中的 ELEMENTS 数量。在我的情况下,每个元素(SInt16)都有 2 个字节,所以我应该通过 mAudioDataByteSize / 2。当它读取最后一个缓冲区时,它从边缘下降了另一个长度并计算了一些随机数据。瞧!非常基本的错误,但是当您查看所有错误的地方时,情况并非如此。

对于任何踩过相同耙子的人...

PS。洗澡的时候突然想到了:)

【讨论】:

以上是关于Last Audio QueueBuffer 有夸大的量级的主要内容,如果未能解决你的问题,请参考以下文章

JAVA报错no suitable driver

audio标签兼容IE11

音频文件:<audio> </audio>

网页播放一个audio暂停其他audio

如何用js控制audio元素连续播放mp3文件

audio标签怎么实现多首音乐的播放啊?