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 有夸大的量级的主要内容,如果未能解决你的问题,请参考以下文章