У меня была такая же проблема.Я использую AVPlayer для воспроизведения композиций (предыдущие записи, для которых я использовал AVAudioRecord).Тем не менее, я обнаружил, что, когда я использовал AVPlayer, я больше не мог использовать AVAudioRecorder.После некоторых поисков я обнаружил, что до тех пор, пока AVPlayer создается в памяти и воспроизводится хотя бы один раз (что обычно и делается сразу после его создания), AVAudioRecorder не будет записывать.Однако, как только AVPlayer будет освобожден, AVAudioRecorder снова будет свободен для записи.Похоже, что AVPlayer поддерживает какое-то соединение, которое нужно AVAudioRecorder, и оно жадное ... оно не пропустит его, пока вы не вырвете его из холодных мертвых рук.
Это решение, которое я 'нашел.Некоторые люди утверждают, что создание экземпляра AVPlayer занимает слишком много времени, чтобы продолжать ломаться и восстанавливать настройки.Однако это не так.Создание AVPlayer на самом деле довольно тривиально.Так же является создание экземпляра AVPlayerItem.То, что не тривиально, это загрузка AVAsset (или любого из его подклассов).Вы действительно хотите сделать это только один раз.Они должны использовать эту последовательность:
- Загрузите AVAsset (например, если вы загружаете из файла, используйте AVURLAsset напрямую или добавьте его в AVMutableComposition и используйте его) и сохраните ссылкук этому.Не отпускай, пока не покончишь с этим.Загрузка - это то, что занимает все время.
- Как только вы будете готовы к игре: создайте экземпляр AVPlayerItem с вашим активом, затем AVPlayer с AVPlayerItem и воспроизведите его.Не сохраняйте ссылку на AVPlayerItem, AVPlayer сохранит ссылку на нее, и вы все равно не сможете повторно использовать ее с другим игроком.
- Как только игра закончится, немедленно уничтожит AVPlayer ... отпустите его, установите его переменную на ноль, что вам нужно сделать.**
- Теперь вы можете записывать.AVPlayer не существует, поэтому AVAudioRecorder может делать свое дело.
- Когда вы будете готовы снова играть, создайте экземпляр AVPlayerItem с активом, который вы уже загрузили, и AVPlayer.Опять же, это тривиально.Актив уже загружен, поэтому задержка не должна быть.
** Обратите внимание, что уничтожение AVPlayer может занять больше, чем просто его освобождение и установка его переменной равной nil.Скорее всего, вы также добавили периодического наблюдателя времени, чтобы отслеживать ход игры.Когда вы делаете это, вы получаете обратно непрозрачный объект, который вы должны удерживать.Если вы не удалите этот элемент из плеера и не отпустите его / не установите ноль, AVPlayer не будет освобожден.Похоже, что Apple создает намеренный цикл хранения, который вы должны прервать вручную.Поэтому перед тем, как уничтожить AVPlayer, вам необходимо (пример):
[_player removeTimeObserver:_playerObserver];
[_playerObserver release]; //Only if you're not using ARC
_playerObserver = nil;
В качестве дополнительной заметки вы, возможно, также настроили NSNotifications (я использую его, чтобы определить, когда игрок завершил игру) ...не забудьте также удалить их.