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

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

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

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

  • AVFoundation API (AVAudioPlayer + AVAudioRecorder)
  • Audio Queue 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 ?


person P i    schedule 25.08.2011    source источник


Ответы (3)


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

person Viraj    schedule 25.08.2011
comment
На самом деле я получил это рабочее место при использовании AVFoundation. Вы просто должны убедиться, что все готово, прежде чем начинать. В дополнение к этому вам нужно запустить рекордер через 70 мсек после плеера, и он будет хорошо выстроен. (это может измениться в зависимости от устройства). - person P i; 26.08.2011
comment
Хорошо знать. Может тебе стоит ответить на свой вопрос. - person Viraj; 27.08.2011

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

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

Сначала загрунтовать.

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

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

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

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

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

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

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

person P i    schedule 28.08.2011
comment
Как вы его заправляете? Вы можете объяснить, что вы имеете в виду, пожалуйста? - person Bjorn Roche; 10.12.2013
comment
К сожалению, до сих пор нет способа сделать это правильно (по крайней мере, я могу найти). 70 мс для меня просто слишком много рассинхронизации, а с учетом сегодняшнего диапазона различных устройств разница в рассинхронизации слишком велика. На iPhone 5s я получаю около 66 мс, а на iPhone 6 - около 40 мс. Я заметил, что это сообщение 2011 года. Вы когда-нибудь находили лучший способ сделать это? - person Sti; 20.10.2014

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

Проверьте этот ответ, у которого есть хорошее объяснение.

person ernewston    schedule 07.04.2015
comment
не могли бы вы предоставить код, пожалуйста. Я борюсь за последние 4 дня. - person Ramkumar chintala; 27.07.2016
comment
Конечно, у меня есть код на Xamarin, но я думаю, нетрудно написать его быстро или объективно. Посмотрите ссылку, которую я даю в ответе, есть пример. Кроме того, убедитесь, что вы подготовили записывающее устройство (я использую AVAudioRecorder и prepareToRecord) и ваш проигрыватель (я создаю экземпляр AVPlayer с именем файла) до того, как они начнут работать с низкой задержкой. Кроме того, когда вы активируете AudioSession, убедитесь, что вы установили категорию playAndRecord. В Xamarin выглядит так: AVAudioSession.SharedInstance().SetPreferredIOBufferDuration(0.005, out error); - person ernewston; 27.07.2016
comment
У меня есть класс AudioSessionHelper с функцией ActivateMyAudioSesion, где я устанавливаю категорию, устанавливаю режим, предпочитаемый IOBufferDuration, а затем делаю его активным. Я вызываю эту функцию перед началом первой записи (не вызывайте ее каждый раз, так как это дорого), или вы можете сделать это при запуске вашего приложения. Надеюсь, поможет! - person ernewston; 27.07.2016
comment
Ссылка: stefanpopp.de/2011/capture-iphone-microphone, ссылка на этот код я не могу играть в динамиках Bluetooth. он играет в наушнике (вверху) во время разговора. Я хочу воспроизводить звук через динамики Bluetooth во время разговора. вы можете мне помочь в этом. Я пробовал так много ссылок и разными способами, но не понимаю. - person Ramkumar chintala; 28.07.2016
comment
Вы пытаетесь одновременно записывать и воспроизводить с малой задержкой по Bluetooth? Я не уверен, как это сделать, и не уверен, можно ли это сделать с малой задержкой, поскольку некоторые устройства Bluetooth ненадежны. - person ernewston; 29.07.2016
comment
с опозданием это возможно. если да, то сколько задержек со своим играли? - person Ramkumar chintala; 29.07.2016
comment
Извините, но я никогда не работал с bluetooth, здесь я не могу вам помочь. - person ernewston; 29.07.2016