2012-03-09 4 views
3

Что я хочу сделать, это взять выходные образцы AVAsset, соответствующие аудиофайлу (без участия видео), и отправить их в класс звукового эффекта, который принимает блок образцов, и Я хочу быть в состоянии это в реальном времени.Выход воспроизведения с перенаправлением элемента avplayer

В настоящее время я смотрю ссылку на ссылки и руководство по программированию AVfoundation, но я не вижу способа перенаправления вывода элемента игрока и отправки его в класс эффектов, а оттуда отправляет преобразованные образцы в аудиовыход (используя AVAssetReaderAudioMixOutput?) и услышать его оттуда. Я вижу, что класс AVAssetReader дает мне способ получить блок выборок с использованием

[myAVAssetReader addOutput:myAVAssetReaderTrackOutput]; 
[myAVAssetReaderTrackOutput copyNextSampleBuffer]; 

, но Apple, документация определяет, что класс AVAssetReader не производятся и не должен использоваться в режиме реального времени ситуации. Есть ли у кого-нибудь предложение о том, где искать, или если у меня есть правильный подход?

ответ

0

В iOS 6 и Mac OS 10.8 появился новый объект MTAudioProcessingTap. Просмотрите видео сеанса 517 от WWDC 2012 - они продемонстрировали именно то, что вы хотите сделать.

WWDC Link

4

MTAudioProcessingTap идеально подходит для этого. Используя AVPlayer, вы можете не блокировать выборки самостоятельно с помощью AVAssetReaderOutput, а затем визуализировать их самостоятельно в очереди аудио или с аудиоустройством.

Вместо этого прикрепите MTAudioProcessingTap к входным параметрам аудиомикшера AVAsset, и вам будут предоставлены образцы в блоках, которые легко можно выбросить в блок эффектов.

Другим преимуществом этого является то, что он будет работать с AVAssets, полученными из URL-адресов, которые не всегда могут открываться другими API-интерфейсами Apple (например, аудиофайлами), такими как библиотека iPod пользователя. Кроме того, вы получаете все функциональные возможности, такие как перенос прерываний аудио, которые AVPlayer предоставляет бесплатно, которые вам в противном случае пришлось бы реализовать вручную, если бы вы пошли с решением AVAssetReader.

Чтобы настроить кран, вы должны настроить некоторые обратные вызовы, которые система вызывает при необходимости во время воспроизведения. Полный код для такой обработки можно найти по адресу this tutorial here.

+0

Я знаю, что это было какое-то время, но: знаете ли вы, как правильно снести краны при изменении элемента плеера AVPlayer (в моем случае, когда AVQueuePlayer переходит к следующему элементу)? Это просто изящно dealloc, когда playerItem и, таким образом, связанный с ним аудиомикс, выпадают из области действия в ARC? Я никогда не вижу, чтобы неработающие и завершающие вызовы call callback вызывались. – Tenfour04

+0

У меня возник вопрос: http://stackoverflow.com/q/19202306/506796 – Tenfour04

0

AVAssetReader не идеален для использования в реальном времени, поскольку он обрабатывает декодирование для вас, а в различных случаях copyNextSampleBuffer может блокировать случайные промежутки времени.

Это, как говорится, AVAssetReader может прекрасно использоваться в потоке производителя, подающем круговой буфер. Это зависит от вашего требуемого использования, но я успешно использовал этот метод для подачи вывода RemoteIO и обработки моих эффектов/сигналов в обратном вызове RemoteIO.