2014-11-25 1 views
0

Я использую AudioComponentInstance audioUnit для записи микрофона на iOS, Liniar PCM с различными частотами выборки (настраивается из приложения). Странная часть, она отлично работает для 11025, 22050 и 44100, но не работает на 8000. Она не дает никакой ошибки или чего-то еще, я просто ничего не получаю в обратном вызове. Кроме того, протестирован с 9600 и он не работает.iOS Захват микрофона LPCM не работает для частоты дискретизации 8 кГц

Кто-нибудь знает причину этого? я начинаю сеанс с

status = AudioUnitInitialize(audioUnit); 
status = AudioOutputUnitStart(audioUnit); 

В случае необходимости я могу предоставить больше (все) код, но я не думаю, что это связано с кодом.

UPDATE

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

status = AudioUnitRender([instance audioUnit], 
          ioActionFlags, 
          inTimeStamp, 
          inBusNumber, 
          inNumberFrames, 
          entry->bufferList); 

Кажется inNumberFrames составляет 186 или 185, и я создал буфер 128. Но теперь он стил неудачу 4 из 5 раз со статусом -50. Я устанавливаю размер буфера 256, 512, 186, но поведение такое же. Результатом является то, что запись искажается, поскольку кадры теряются.

ответ

0

Ну, сам выяснил ответ. По некоторым неясным причинам, 186 кадров, о которых сообщалось, были готовы к обратному вызову, было слишком много. После того как я заменил значение 185 в вызове AudioUnitRender(), он работал как шарм. Кажется, что есть ошибка, и когда-то CoreAudio сообщает о дополнительном фрейме как готовом.

Для более высоких частот проблема не существовала, так как количество кадров всегда было постоянным, а мощность 2 (256, 512, 1024)