2012-06-03 3 views
1

현재 iPhone의 마이크에서 오디오를 읽은 다음 일부 처리 및 비주얼을 수행하는 응용 프로그램을 작성하는 중입니다. 물론 나는 처음으로 오디오로 시작하지만 사소한 문제가 하나 있습니다.AudioQueue 오디오 샘플 녹음

샘플링 속도를 44100Hz로 정의하고 4096 개의 샘플을 저장하도록 버퍼를 정의했습니다. 그게 뭐야. 그러나이 데이터를 출력 할 때 MATLAB에 복사하여 정확성을 다시 확인합니다. 사용해야하는 샘플 속도는 올바른 iPhone 아이폰 정의 속도 또는 22050 Hz의 절반입니다.

다음 코드와 관련이 있으며 패킷 당 2 바이트를 넣는 방법과 버퍼가 반복 될 때 버퍼가 전체 패킷을 뱉어 내 코드가 단일 패킷이라고 가정합니다. 번호. 그래서 내가 궁금해하는 것은 패킷을 분리하여 개별 번호로 읽는 방법입니다.

- (void)setupAudioFormat { 
    memset(&dataFormat, 0, sizeof(dataFormat)); 
    dataFormat.mSampleRate = kSampleRate; 
    dataFormat.mFormatID = kAudioFormatLinearPCM; 
    dataFormat.mFramesPerPacket = 1; 
    dataFormat.mChannelsPerFrame = 1; 
    // dataFormat.mBytesPerFrame = 2; 
    // dataFormat.mBytesPerPacket = 2; 
    dataFormat.mBitsPerChannel = 16; 
    dataFormat.mReserved = 0; 

    dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel/8) * dataFormat.mChannelsPerFrame; 
    dataFormat.mFormatFlags = 
    kLinearPCMFormatFlagIsSignedInteger | 
    kLinearPCMFormatFlagIsPacked; 
} 

내가 설명한 내용이 분명하지 않은 경우 알려 주시기 바랍니다. 감사!

편집

내가 데이터

float *audioFloat = (float *)malloc(numBytes * sizeof(float)); 
int *temp = (int*)inBuffer->mAudioData; 
int i; 
float power = pow(2, 31); 
for (i = 0;i<numBytes;i++) { 
    audioFloat[i] = temp[i]/power; 
    printf("%f ",audioFloat[i]); 
} 
+0

어떻게 버퍼링을 반복하고 각 샘플을 인쇄합니까? 문제가 있는지 코드를 게시하십시오. – hotpaw2

+0

내 생각에 스테레오 데이터 스트림을 수신하고 있습니다. 왼쪽 채널에서 16 비트, 오른쪽 채널에서 16 비트. – Davyd

+0

일부 인쇄 코드가 추가되었습니다. 이것이 무엇이든 지우면 알려 주시겠습니까 – MZimmerman6

답변

0

내가 무엇을하고 있었는지의 문제를 발견를 인쇄하는 데 사용되는 코드를 추가. 그것은 c 포인터 문제 였고, 전에 C로 프로그래밍 한 적이 없기 때문에 물론 잘못되었습니다.

inBuffer-> mAudioData를 int 배열로 직접 변환 할 수 없습니다. 그래서 나는 단순히 한 일은 단지 벌금

SInt16 *buffer = malloc(sizeof(SInt16)*kBufferByteSize); 
buffer = inBuffer->mAudioData; 

다음이이 일을했고 지금 내 데이터는 정확한 길이이며 데이터가 제대로 표시됩니다.

+0

위의 누출 메모리가 아닙니까? (malloc하지만 무료 없음) – Iftah

+0

필요한 메모리를 확보한다고 가정합니다. – MZimmerman6

0

당신의 답을 보았습니다. 엔디안 문제가 바뀌었기 때문에 잘못된 샘플 데이터 바이트를주는 근본적인 문제가 있습니다.

- (무효) feedSamplesToEngine (UINT32) audioDataBytesCapacity audioData (무효 *) audioData {INT sampleCount = audioDataBytesCapacity /를 sizeof (SAMPLE_TYPE);

SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData; 
//SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount);//for swapping endians 

std::string shorts; 
double power = pow(2,10); 
for(int i = 0; i < sampleCount; i++) 
{ 
    SAMPLE_TYPE sample_le = (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue 
    char dataInterim[30]; 
    sprintf(dataInterim,"%f ", sample_le/power); // normalize it. 
    shorts.append(dataInterim); 
}