2012-03-29 43 views
1

我需要讀取音頻採樣值。我使用的是audioQueue回調(從蘋果SpeakHere爲例):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

該文件具有與您的系統不同的永久性。您必須交換每個樣本的字節順序。樣本也是有符號的16位整數(SInt16),而不是UInt16。因此最大值是32767(不是65535),最小值是-32767。

看看ExtendedAudioFile.h和AudioConverter.h中的幫助轉換。

+0

謝謝你的回答。但我已經使用[鏈接](https://github.com/reinforce-lab/MonoTouch.AudioUnit)和SInt32的音頻單元示例來獲取示例值,它對我很有幫助。順便說一句,SInt16和UInt16有區別嗎?我的意思是使用UInt16而不是SInt16來獲取範圍從0(-32767 in SInt16)到65535(在SInt16中爲32767)的值是錯誤的? – f3n1kc 2012-03-30 11:01:37

+0

對我來說沒關係,但是除非你使用字節交換和使用SInt16,否則你不會看到與大膽相同的值。 – hooleyhoop 2012-03-30 11:31:28