2012-03-29 7 views
1

오디오 샘플 값을 읽어야합니다. 나는 (애플 SpeakHere 예제에서) 그 audioQueue 콜백을 위해 사용하고 있습니다 :AudioQueue 샘플 값이 잘못되었습니다.

 UInt32 samplesCount = inCompleteAQBuffer->mAudioDataBytesCapacity/2; 

    UInt16 *samples = (UInt16 *)inCompleteAQBuffer->mAudioData; 

    for (int i=0; i < samplesCount; i++) 
    { 
     printf("%i\n", samples[i]); 
    } 

값이 반환됩니다,하지만 난 대담에서 그래프와 비교하면, 그들은 잘못된 것 같다 :

screen

Audacity 값은 1 (65535)에서 -1 (0)까지입니다. 그래서 논리적으로 첫 번째 샘플 값이 32767이 있어야한다, 두 번째는 50 ~ 000 ...

해야하지만 다른 결과를받을 :

value - position 

    65535 - 0 
    29501 - 1 
    26086 - 2 
    63656 - 3 
    28477 - 4 
    65407 - 5 
    36802 - 6 
    36546 - 7 
    18244 - 8 
    17220 - 9 

    player settings: 

    (Float64) mSampleRate = 44100 
    (UInt32) mBytesPerPacket = 2 
    (UInt32) mFramesPerPacket = 1 
    (UInt32) mBytesPerFrame = 2 
    (UInt32) mChannelsPerFrame = 1 
    (UInt32) mBitsPerChannel = 16 
    (UInt32) mReserved = 0 

질문 - 샘플 값이 mAudioData에서 잘못 반환 된 이유는 무엇입니까?

답변

2

파일의 인코딩 방식이 시스템과 다릅니다. 각 샘플의 바이트 순서를 바꿔야합니다. 또한 샘플은 UInt16이 아닌 부호있는 16 비트 정수 (SInt16)입니다. 따라서 최대 값은 32767 (65535 아님)이고 최소값은 -32767입니다.

변환 도움말을 보려면 ExtendedAudioFile.h 및 AudioConverter.h를보십시오.

+0

답장을 보내 주셔서 감사합니다. 하지만 샘플 값을 얻기 위해 [link] (https://github.com/reinforce-lab/MonoTouch.AudioUnit) 및 SInt32의 오디오 유닛 예제를 이미 사용했으며 저에게 도움이되었습니다. Btw, SInt16과 UInt16의 차이점은 무엇입니까? SInt16 대신 UInt16을 사용하여 0에서부터 -32767 (SInt16에서 -32767)까지의 값을 65535 (SInt16에서 32767)까지 얻는 것은 잘못된 것입니까? – f3n1kc

+0

괜찮아요.하지만 바이트 스왑을 쓰지 않고 SInt16을 사용하지 않으면 대담함과 같은 값을 보지 못할 것입니다. – hooleyhoop

관련 문제