我一直有同样的问题。我使用 AVPlayer 来播放作品(我之前使用 AVAudioRecord 的录音)。但是,我发现一旦我使用了 AVPlayer,我就不能再使用 AVAudioRecorder。经过一番搜索,我发现只要在内存中实例化 AVPlayer 并且至少播放过一次(通常是实例化后立即执行的操作),AVAudioRecorder 就不会录制。但是,一旦 AVPlayer 被解除分配,AVAudioRecorder 就可以再次自由录制。似乎 AVPlayer 持有 AVAudioRecorder 需要的某种连接,而且它很贪婪……除非你从它冰冷的死手上撬开它,否则它不会放手。
这是我找到的解决方案。一些人声称实例化 AVPlayer 需要花费太多时间来继续分解和设置备份。然而,事实并非如此。实例化 AVPlayer 实际上非常简单。实例化 AVPlayerItem 也是如此。重要的是加载 AVAsset (或它的任何子类)。你真的只想这样做一次。他们的关键是使用这个序列:
- 加载 AVAsset(例如,如果您从文件加载,则直接使用 AVURLAsset 或将其添加到 AVMutableComposition 并使用它)并保留对它的引用。在你完成之前不要放手。加载它是需要所有时间的。
- 一旦你准备好播放:用你的资产实例化 AVPlayerItem,然后用 AVPlayerItem 实例化 AVPlayer 并播放它。不要保留对 AVPlayerItem 的引用,AVPlayer 将保留对它的引用,并且无论如何您都不能与其他播放器重用它。
- 播放完毕后,立即销毁AVPlayer...释放它,将其 var 设置为 nil,无论您需要做什么。**
- 现在可以录制了。AVPlayer 不存在,所以 AVAudioRecorder 可以自由地做它的事情。
- 当您准备好再次播放时,使用您已经加载的资产和 AVPlayer 重新实例化 AVPlayerItem。同样,这是微不足道的。资产已经加载,所以不应该有延迟。
** 请注意,销毁 AVPlayer 可能需要的不仅仅是释放它并将其 var 设置为 nil。最有可能的是,您还添加了一个定期时间观察器来跟踪播放进度。当你这样做时,你会收到一个你应该抓住的不透明物体。如果您不从播放器中删除此项目并释放它/将其设置为 nil,AVPlayer 将不会解除分配。Apple 似乎故意创建了一个您必须手动中断的保留周期。因此,在销毁 AVPlayer 之前,您需要(示例):
[_player removeTimeObserver:_playerObserver];
[_playerObserver release]; //Only if you're not using ARC
_playerObserver = nil;
作为旁注,您可能还设置了 NSNotifications(我使用一个来确定播放器何时完成播放)...不要忘记删除它们。