이 문제를 해결하는 사람은 Sherlock Holmes 트로피를 가져야합니다. 여기 간다.마지막 AudioQueueBuffer의 수치가 과장되어
오디오 (LPCM, SInt16, 4 버퍼)를 녹음하기 위해 AudioQueues를 사용합니다. 콜백에서 샘플을 float으로 변환하고 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와 같은 다른 프로젝트에서도 마찬가지입니다. 앱이 제대로 작동하더라도 기록 된 내용을 녹음하고 재생할 때도 마찬가지입니다.
나는 그것을 얻지 못한다. 나는 이것을 알아 내기 위해 머리를 부 풀렸다. 누군가가 실마리를했을 경우 도움이된다면 ...
다음은 콜백입니다 :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가'나는 미리 할당 한 float 배열입니다.