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 мс латентности, что достаточно для моего приложения.
Отметьте этот ответ, который имеет хорошее объяснение.