Чтение данных аудио буфера с AudioQueue - PullRequest
6 голосов
/ 08 августа 2009

Я пытаюсь прочитать аудиоданные через AudioQueue. Когда я это сделаю, я смогу убедиться, что битовая глубина файла составляет 16 бит. Но когда я получаю фактические данные выборки, я вижу только значения от -128 до 128. Но я также вижу подозрительно выглядящие чередующиеся данные, что дает мне уверенность, что я просто не правильно читаю данные.

Итак, для начала я могу убедиться, что исходный файл - это 44100, 16-битный, монофонический wav-файл.

Мой буфер выделен так:

char *buffer= NULL;
buffer = malloc(BUFFER_SIZE);
assert(buffer);

Все соответствующие значения установлены и используются в:

AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);       

В качестве теста, чтобы увидеть полученные данные, я запускаю:

for(int i=0;i<BUFFER_SIZE;i++){
  NSLog(@"%i", buffer[i]);
}

Теперь я знаю, что мой исходный файл имеет пики повсюду, но значения, которые я вижу, только макс. При -128 и 128. Поскольку это 16-битный файл, я бы ожидал, что значения будут вместо -32768 до 32768.

Кроме того, в данных, по-видимому, есть две закономерности. Вот пример возвращаемых данных:

70
-13
31
-11
-118
-9
-15
-7
116
-4
31
-1
28
1
84
2
-123
3
-97
4
110
5
54
6
126

Теперь взгляните на каждый второй ряд, начиная со второго: -13. Видите, как оно увеличивается, не равномерно, а хотя бы плавно? Строки с нечетными номерами далеко не так гладки.

Моей первой мыслью было бы, что это чередующиеся стереоданные, но нет, это только один канал, поэтому чередования быть не должно, верно?

Мое лучшее предположение заключается в том, что я просто неправильно читаю данные, поэтому примеры данных охватывают два результата. Есть идеи, как правильно его прочитать?

Спасибо, что прочитали весь вопрос, и за любые идеи, которые вы можете предложить.

1 Ответ

8 голосов
/ 08 августа 2009
char *buffer= NULL;

В этом причина. Вы перебираете подписанные байты, а не 16-битные выборки.

Объявите переменную как содержащую указатель на двухбайтовые значения:

SInt16 *buffer = NULL;

Затем выполните итерацию более половины числа выборок, чем байтов:

for(int i=0;i < (BUFFER_SIZE / sizeof(*buffer));i++){
  NSLog(@"%i", buffer[i]);
}

Я бы переименовал BUFFER_SIZE в BUFFER_SIZE_BYTES, чтобы уточнить это.

...