私は同じ問題を抱えています。AVPlayer を使用してコンポジションを再生します (AVAudioRecord を使用した以前の録音)。しかし、AVPlayer を使用すると、AVAudioRecorder を使用できなくなることがわかりました。いくつかの検索の後、AVPlayer がメモリ内でインスタンス化され、少なくとも 1 回再生されている限り (通常はインスタンス化直後に行うことです)、AVAudioRecorder は記録されないことがわかりました。ただし、AVPlayer の割り当てが解除されると、AVAudioRecorder は再び自由に録音できるようになります。AVPlayer は、AVAudioRecorder が必要とするある種の接続を保持しているようです。それは貪欲です...冷酷な死んだ手からこじ開けるまで手放しません。
これが私が見つけた解決策です。一部の人々は、AVPlayer をインスタンス化するのに時間がかかりすぎて、故障して元に戻すのに時間がかかりすぎると主張しています。しかし、これは正しくありません。AVPlayer のインスタンス化は、実際には非常に簡単です。AVPlayerItem のインスタンス化も同様です。些細なことではないのは、AVAsset (またはそのサブクラスのいずれか) をロードすることです。あなたは本当にそれを一度だけしたいです。彼らの鍵は、このシーケンスを使用することです:
- AVAsset を読み込み (たとえば、ファイルから読み込む場合は、AVURLAsset を直接使用するか、AVMutableComposition に追加して使用します)、参照を保持します。使い終わるまで手放さないでください。読み込みには常に時間がかかります。
- プレイする準備ができたら、アセットで AVPlayerItem をインスタンス化し、AVPlayerItem で AVPlayer をインスタンス化して再生します。AVPlayerItem への参照を保持しないでください。AVPlayer はそれへの参照を保持し、別のプレイヤーでそれを再利用することはできません。
- 再生が完了したら、すぐにAVPlayer を破棄します...解放し、変数を nil に設定します。必要なことは何でもします。**
- これで録音できます。AVPlayer は存在しないため、AVAudioRecorder は自由に実行できます。
- もう一度プレイする準備ができたら、既にロードしたアセットと AVPlayer を使用して AVPlayerItem を再インスタンス化します。繰り返しますが、これは些細なことです。アセットは既に読み込まれているため、遅延は発生しません。
** AVPlayer を破棄するには、解放して変数を nil に設定するだけでは不十分な場合があることに注意してください。ほとんどの場合、プレイの進行状況を追跡するために定期的な時間オブザーバーも追加しました。これを行うと、保持するはずの不透明なオブジェクトが返されます。このアイテムをプレーヤーから削除せずに解放するか nil に設定すると、AVPlayer はロックを解除しません。Apple は、手動で中断しなければならない意図的な保持サイクルを作成しているようです。したがって、AVPlayer を破棄する前に、次のことを行う必要があります (例):
[_player removeTimeObserver:_playerObserver];
[_playerObserver release]; //Only if you're not using ARC
_playerObserver = nil;
補足として、NSNotifications も設定している可能性があります (プレーヤーがいつプレイを終了したかを判断するために使用します)...それらも削除することを忘れないでください。