iOS: пример кода для одновременной записи и воспроизведения - PullRequest
14 голосов
/ 25 августа 2011

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Пример 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

РЕДАКТИРОВАТЬ (2): Здесь гораздо приятнее выглядит: http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

РЕДАКТИРОВАТЬ (3): Как записать звук на iPhone с AVAudioRecorder?

Ответы [ 3 ]

6 голосов
/ 25 августа 2011

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

5 голосов
/ 28 августа 2011

Как подсказывает Вирадж, вот ответ.

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

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

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

Итак, начинай все.Затем воспроизведите все.

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

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

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

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

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

1 голос
/ 07 апреля 2015

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

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

...