7

AVPlayer を使用するビュー コントローラーがあります。このView Controllerは、ユーザーがAVAudioRecorderを使用してオーディオを録音できるモーダルView Controllerをロードできます。

これが起こることです:

ユーザーが [AVPLayer play] を使用して最初のコントローラーでコンポジションを再生すると、AVAudioRecorder はモーダル ビュー コントローラーに記録されません。エラーはありませんが、AVAudioRecorder によって返される現在の時刻は 0.0 です。

ユーザーがモーダル ダイアログを閉じて再読み込みした場合。AVAudioRecorder は正常に動作します。

これは何度でも繰り返すことができます AVAudioRecorder は、[AVPlayer play] 呼び出しの後に最初に呼び出されたときに機能しません

私はこれと何日も戦ってきましたが、AVPlayer と AVAudioRecorder の両方に関連するコードを再編成しましたが、まだ奇妙な動作をしています。

どんな助けやポインタも大歓迎です

前もって感謝します

ジャンピエール

4

7 に答える 7

9

私も同じ問題を抱えていましたが、これが私が見つけた解決策です。

AVAudioRecord記録するときは、初期化後に次の行コードを記述します。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:NULL];

次に、メソッドを呼び出しrecordます。

于 2012-05-09T07:48:29.003 に答える
3

AVAudioSessionのカテゴリ、つまり再生または録音をどのように設定していますか? 次のようなものを試してください

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
于 2011-04-22T17:55:13.970 に答える
1

AVPlayerとAVAudioRecorderを同時に使用する必要がある場合は、次の手順を実行してください。

  1. オーディオカテゴリを「再生および録音」に設定します(上記またはCベースのオーディオセッション機能を使用)
  2. 「record」メソッドは、「play」メソッドの呼び出し後に少し遅れて呼び出す必要があります。(0.5秒設定しました)

これを指定しない場合、再生は開始されますが、記録は開始されません。

于 2012-07-11T13:34:01.917 に答える
1

私は同じ問題を抱えています。AVPlayer を使用してコンポジションを再生します (AVAudioRecord を使用した以前の録音)。しかし、AVPlayer を使用すると、AVAudioRecorder を使用できなくなることがわかりました。いくつかの検索の後、AVPlayer がメモリ内でインスタンス化され、少なくとも 1 回再生されている限り (通常はインスタンス化直後に行うことです)、AVAudioRecorder は記録されないことがわかりました。ただし、AVPlayer の割り当てが解除されると、AVAudioRecorder は再び自由に録音できるようになります。AVPlayer は、AVAudioRecorder が必要とするある種の接続を保持しているようです。それは貪欲です...冷酷な死んだ手からこじ開けるまで手放しません。

これが私が見つけた解決策です。一部の人々は、AVPlayer をインスタンス化するのに時間がかかりすぎて、故障して元に戻すのに時間がかかりすぎると主張しています。しかし、これは正しくありません。AVPlayer のインスタンス化は、実際には非常に簡単です。AVPlayerItem のインスタンス化も同様です。些細なことではないのは、AVAsset (またはそのサブクラスのいずれか) をロードすることです。あなたは本当にそれを一度だけしたいです。彼らの鍵は、このシーケンスを使用することです:

  1. AVAsset を読み込み (たとえば、ファイルから読み込む場合は、AVURLAsset を直接使用するか、AVMutableComposition に追加して使用します)、参照を保持します。使い終わるまで手放さないでください。読み込みには常に時間がかかります。
  2. プレイする準備ができたら、アセットで AVPlayerItem をインスタンス化し、AVPlayerItem で AVPlayer をインスタンス化して再生します。AVPlayerItem への参照を保持しないでください。AVPlayer はそれへの参照を保持し、別のプレイヤーでそれを再利用することはできません。
  3. 再生が完了したら、すぐにAVPlayer を破棄します...解放し、変数を nil に設定します。必要なことは何でもします。**
  4. これで録音できます。AVPlayer は存在しないため、AVAudioRecorder は自由に実行できます。
  5. もう一度プレイする準備ができたら、既にロードしたアセットと AVPlayer を使用して AVPlayerItem を再インスタンス化します。繰り返しますが、これは些細なことです。アセットは既に読み込まれているため、遅延は発生しません。

** AVPlayer を破棄するには、解放して変数を nil に設定するだけでは不十分な場合があることに注意してください。ほとんどの場合、プレイの進行状況を追跡するために定期的な時間オブザーバーも追加しました。これを行うと、保持するはずの不透明なオブジェクトが返されます。このアイテムをプレーヤーから削除せずに解放するか nil に設定すると、AVPlayer はロックを解除しません。Apple は、手動で中断しなければならない意図的な保持サイクルを作成しているようです。したがって、AVPlayer を破棄する前に、次のことを行う必要があります (例):

[_player removeTimeObserver:_playerObserver];
[_playerObserver release]; //Only if you're not using ARC
 _playerObserver = nil;

補足として、NSNotifications も設定している可能性があります (プレーヤーがいつプレイを終了したかを判断するために使用します)...それらも削除することを忘れないでください。

于 2012-05-03T14:37:47.493 に答える
0

[AVAudioRecorder record];代わりにすべきではありませんplayか?

于 2011-04-08T16:22:53.740 に答える
0

@Aaron Haymanの説明は正確ですが、私にとっての解決策は非常に簡単でした。プレーヤー デリゲートの didFinishPlaying メソッドを実装し、そこでプレーヤーを解放するだけです。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    self.playerWord = nil;
}
于 2014-08-27T20:18:40.487 に答える
0

同じ問題がありました: AVAudioRecorder は録音を開始しませんでした。私の例は少し異なります。異なるビューに複数の AVAudioPlayer を持つタブバー ベースのアプリがあります。例として、最初に読み込まれたビューには 3 つの AVAudioPlayer があり、2 番目のビューには 1 つの AVAudioPlayer と 1 つの AVAudioRecorder があるとします。それらはすべて viewDidLoad メソッドで開始されます。

レコーダーがセカンド ビューで動作していませんでした。録画ボタンを押したとき、ビューがわずかに揺れ、録画が開始されませんでした。不思議なことに、シミュレーターは正常に動作し、同じ症状を示しませんでした... (誰かが理由を知っていますか?)

いくつかの調査とこのスレッドを読んだ後、最初のビューでプレイヤーを nil に設定していないことに気付きました。viewDidDisappear メソッドでそれらを nil に設定すると、再び問題なく動作していました。

これが私を助けたものです:

-(void)viewDidDisappear:(BOOL)animated {
    firstPlayer = nil;
    secondPlayer = nil;
    thirdPlayer = nil;
}

ViewDidUnload は役に立ちませんでした。ビューを切り替えるときに、クラス自体の変数がアンロードされなかったためです。

これが他の人にも役立つことを願っています。

于 2012-05-28T20:45:18.140 に答える