iOS: пример кода для одновременной записи и воспроизведения
Я разрабатываю простое доказательство концепции для многодорожечного рекордера.
Очевидной отправной точкой является воспроизведение из файла A. caf в наушники с одновременной записью микрофонного входа в файл B. caf
Этот вопрос - запись и воспроизведение аудио одновременно - указывает на то, что есть три уровня, на которых я могу работать:
- AVFoundation API (AVAudioPlayer + AVAudioRecorder)
- API очереди аудио
- API аудиоустройств (RemoteIO)
На каком уровне лучше всего работать? Очевидно, что общий ответ состоит в том, чтобы работать на самом высоком уровне, который получает работу, которая была бы AVFoundation.
Но я беру эту работу от кого-то, кто сдался из-за проблем с задержкой (он получал задержку в 0,3 секунды между файлами), поэтому, возможно, мне нужно работать на более низком уровне, чтобы избежать этих проблем?
Кроме того, какой исходный код доступен для springboard? Я смотрел на образец SpeakHere ( http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html ). если я не могу найти что-то попроще, я использую это.
Но может ли кто-нибудь предложить что-то более простое/другое? Я бы предпочел не работать с кодом C++, если бы мог этого избежать.
Известно ли кому-нибудь об открытом коде, использующем для этого 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?
3 ответа:
Чтобы избежать проблем с задержкой, вам придется работать на более низком уровне, чем AVFoundation. Проверьте этот пример кода от Apple - Auriotouch . Он использует удаленный ввод / вывод
Как предложил Вирадж, вот ответ.
Да, вы можете достичь очень хороших результатов, используя AVFoundation. Во-первых, вы должны обратить внимание на то, что как для проигрывателя, так и для диктофона их активация-это двухэтапный процесс.
Сначала вы его прогоняете.
Затем вы играете в нее.
Итак, пристрелите все. Тогда играйте все подряд.
Это снизит вашу задержку примерно до 70 мс. я проверил, записав ТИК метронома, а затем воспроизвел его через динамики при одновременном поднесении iPhone к динамикам и одновременной записи.
Вторая запись имела четкое эхо, которое, как я обнаружил, было ~70 мс. я мог бы проанализировать сигнал в Audacity, чтобы получить точное смещение.Так что для того, чтобы выстроить все, я просто performSelector:x withObject: y afterDelay: 70.0/1000.0
Могут быть скрытые загвоздки, например задержка может отличаться от устройства к устройству. он может даже отличаться в зависимости от активности устройства. Это даже так возможно, поток может быть прерван/перенесен между запуском проигрывателя и запуском диктофона.
Но это работает, и намного опрятнее, чем возиться с аудио очередями / блоками.
У меня была эта проблема, и я решил ее в своем проекте, просто изменив параметр
PreferredHardwareIOBufferDuration
AudioSession
. Я думаю, что у меня есть только 6 мс задержки сейчас, что достаточно хорошо для моего приложения.Проверьтеэтот ответ , который имеет хорошее объяснение.