2012-03-29 3 views
1

Мне нужно прочитать значения звуковых образцов. Я использую для этого звуковых сообщений обратного вызова (от компании Apple 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

Благодарим вас за ответ. Но я уже использовал пример аудио единицы из [link] (https://github.com/reinforce-lab/MonoTouch.AudioUnit) и SInt32, чтобы получить образцы значений, и это сработало для меня. Btw, есть ли разница между SInt16 и UInt16? Я имею в виду использование UInt16 вместо SInt16 для получения значений в диапазоне от 0 (-32767 в SInt16) до 65535 (32767 в SInt16) неправильно? – f3n1kc

+0

Все в порядке со мной, но вы не увидите значений так же, как смелость, если вы не поменяете байты и не используете SInt16. – hooleyhoop