Примеры значений AudioQueue неверны - PullRequest
1 голос
/ 29 марта 2012

Мне нужно прочитать значения аудиосэмпла.Я использую для этого обратного вызова audioQueue (из примера Apple SpeakHere):

     UInt32 samplesCount = inCompleteAQBuffer->mAudioDataBytesCapacity / 2;

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

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

Значения возвращаются, но когда я сравниваю их с графиком из Audacity, они кажутся неправильными:

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, неверны?

1 Ответ

2 голосов
/ 29 марта 2012

Файл имеет иной порядок байтов, чем ваша Система.Вы должны поменять местами порядок следования байтов.Также примерами являются 16-разрядные целые числа со знаком (SInt16), а не UInt16.Следовательно, максимальное значение равно 32767 (не 65535), а минимальное значение равно -32767.

Загляните в ExtendedAudioFile.h и AudioConverter.h для помощи в конвертации.

...