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 14

3 ответа:

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

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

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

Сначала вы его прогоняете.

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

Итак, пристрелите все. Тогда играйте все подряд.

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

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

Так что для того, чтобы выстроить все, я просто performSelector:x withObject: y afterDelay: 70.0/1000.0

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

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

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

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