2009-08-08 2 views
6

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

Итак, для начала я могу проверить, что исходный файл - это 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 в nd 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. Посмотрите, как это увеличивается, не равномерно, но, по крайней мере, гладко? Строки с нечетным номером нигде не близки к этой гладкой.

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

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

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

ответ

8
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 к уточните это.

+0

Еще раз спасибо Peter! –