IOS: Пример кода для одновременной записи и воспроизведения

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

Очевидной отправной точкой является воспроизведение из файла A.caf в наушники при одновременном вводе микрофона в файл B.caf

Этот вопрос - Запись и воспроизведение звука одновременно - указывает, что есть три уровня, на которых я могу работать:

  • API AVFoundation (AVAudioPlayer + AVAudioRecorder)
  • API очереди аудио
  • API аудиоустройств (RemoteIO)

Каков наилучший уровень работы? Очевидно, что общий ответ заключается в том, чтобы работать на самом высоком уровне, который выполняет свою работу, что будет AVFoundation.

Но я беру эту работу от кого-то, кто отказался от проблем с задержкой (он получал задержку между файлами за 0,3 секунды), поэтому, возможно, мне нужно работать на более низком уровне, чтобы избежать этих проблем?

Кроме того, какой исходный код доступен для трамплина? Я смотрел образец SpeakHere (http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html). если я не могу найти что-то более простое, я буду использовать это.

Но может ли кто-нибудь предложить что-то более простое/другое? Я бы предпочел не работать с кодом С++, если я могу его избежать.

Кто-нибудь знает какой-то публичный код, который использует AVFoundation для этого?

EDIT: Пример AVFoundation здесь: http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1

EDIT (2): Намного приятнее выглядит здесь: http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT (3): Как записать аудио на iPhone с помощью AVAudioRecorder?

Ответы

Ответ 1

Как было предложено Вираджем, вот ответ.

Да, вы можете добиться очень хороших результатов с помощью AVFoundation. Во-первых, вам нужно обратить внимание на то, что как для проигрывателя, так и для рекордера, их активирование - это двухэтапный процесс.

Сначала запустите его.

Затем вы играете в нее.

Итак, просто все. Затем играйте все.

Это уменьшит время ожидания до 70 мс. Я протестировал, записав отметку метронома, а затем воспроизвел ее через динамики, удерживая iPhone до громкоговорителей и одновременно записывая.

Вторая запись имела ясное эхо, которое, как мне показалось, было ~ 70 мс. Я мог бы проанализировать сигнал в Audacity, чтобы получить точное смещение.

Итак, чтобы выровнять все, я просто выполняю выбор: x withObject: y afterDelay: 70.0/1000.0

Там могут быть скрытые коряги, например, задержка может отличаться от устройства к устройству. он может даже отличаться в зависимости от активности устройства. Даже возможно, что поток может быть прерван/перенесен между запуском проигрывателя и запуском рекордера.

Но он работает и намного более аккуратный, чем возиться со звуковыми очередями/единицами.

Ответ 2

Чтобы избежать проблем с задержкой, вам придется работать на более низком уровне, чем AVFoundation. Проверьте этот образец кода от Apple - Auriotouch. Он использует удаленный ввод-вывод.

Ответ 3

У меня была эта проблема, и я решил ее в своем проекте, просто изменив параметр PreferredHardwareIOBufferDuration AudioSession. Я думаю, что сейчас у меня всего 6 мс латентности, что достаточно для моего приложения.

Отметьте этот ответ, который имеет хорошее объяснение.