解决这个问题的人必须拥有福尔摩斯奖杯。来了
我正在使用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,以不使野生缓冲区入队,一旦消失,就不再有巨大的数字,其他缓冲区将继续正常填充。我放入了一个按钮,将其删除后重新排队,一旦重新排队,它又充满了巨大的样本(即那个缓冲区!)。
而现在,樱桃-我将代码放在其他项目中(例如苹果公司的SpeakHere)来计算均值,同样的事情在这里也发生了。
我只是不明白,我已经想尽办法弄清楚了。如果有人有线索...
这是回调,如果有帮助的话:
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”是我已预先分配的浮点数组。
最佳答案
获得奖杯的也是我。错误是vDSP函数不应该具有mAudioDataByteSize参数,因为它们需要数组中的ELEMENTS数量。在我的情况下,每个元素(SInt16)都有2个字节,因此我应该传递mAudioDataByteSize /2。当它读取最后一个缓冲区时,它从边缘下降了另一个长度并计算了一些随机数据。瞧!这是一个非常基本的错误,但是当您在所有错误的地方查看时,它似乎都不会出现。
对于踩踏相同耙子的任何人...
PS。洗澡时来找我:)