0

私の状況: AVAudioRecorder でオーディオ ファイルを録音しています。レコードを再生するには、MPMoviePlayerViewController を使用しています。録音、再生、停止等動作しています。

私の問題: 再生後: ホーム ボタンを押して (アプリをバックグラウンドに移動)、もう一度アプリを開くと、アプリがクラッシュします。再生が完了した場合にのみ発生します ([完了] を押すか、最後まで再生させます)。プレイ中にホームボタンを押して再度アプリを開くと、すべて問題ありません。

これがmovieplayerの私のコードです:(hereのコードを使用)

- (void)playVideo:(NSString*)aVideoUrl {
  MPMoviePlayerViewController *playerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]];  

  // Remove the movie player view controller from the "playback did finish" notification observers
  [[NSNotificationCenter defaultCenter] removeObserver:playerVC
                                              name:MPMoviePlayerPlaybackDidFinishNotification
                                            object:playerVC.moviePlayer];

  // Register this class as an observer instead
  [[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(movieFinishedCallback:)
                                           name:MPMoviePlayerPlaybackDidFinishNotification
                                         object:playerVC.moviePlayer];

  // Set the modal transition style of your choice
  playerVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

  // Present the movie player view controller
  //[self presentModalViewController:playerVC animated:YES];
  [self presentMoviePlayerViewControllerAnimated:playerVC];

  // Start playback
  [playerVC.moviePlayer prepareToPlay];
  [playerVC.moviePlayer play];
}

- (void)movieFinishedCallback:(NSNotification*)aNotification {
  MPMoviePlayerController *moviePlayer = [aNotification object];

  // Remove this class from the observers
  [[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:moviePlayer];

  // Dismiss the view controller
  [self dismissModalViewControllerAnimated:YES];
  //[self dismissMoviePlayerViewControllerAnimated];
}

私は iOS5 と ARC を使用しています。

コードを含むクラスは通常の UIViewController であり、メソッドの呼び出し元でもあります。

デバイスでのみ発生します。シミュレーターではクラッシュしませんでしたが、私の iPhone 4 と iPad 1 ではクラッシュしました。

アプリがクラッシュする理由がわかりません。

クラッシュからのスタックトレース

編集:よくわかりませんが、クラッシュを解決したと思います。

問題はオーディオファイルを再生していないか、それだけではないと思います。録音もこの問題の一部のようです。

AVAudioRecorder で録音するための私のクラスでは、このクラスを AVAudioSession のデリゲートとして登録しました: [[AVAudioSession sharedInstance] setDelegate: self];

これを「ルート」クラス (すべてを開始する「メイン」クラス) に移動し、プロトコル メソッド「beginInterruption」および「endInterruption」を実装すると (NSLog ステートメントでのみ認識されます)、「beginInterruption」が表示されます。アプリをバックグラウンドで設定すると ' が呼び出され、アプリを再度 (フォアグラウンドで) 起動すると 'endInterruption' が呼び出されます。スタックトレースでは、「AudioSessionInterruptionListener」のようなものを見ることができます...デリゲートメソッドの一部のようです。

編集2

アプリを数回テストしましたが、クラッシュは二度と起こりません。AVAudioSessionDelegate を「ルート」クラスに設定することが答えのようです。

4

1 に答える 1

0

私にとっては、AVAudioSessionデリゲートを登録する必要がありました:

[[AVAudioSession sharedInstance] setDelegate: self];

これを audiorecord 処理クラスの「親」クラスに追加しました。
また、AVAudioSession デリゲートを実装するbeginInterruption必要endInterruptionがありました。

この後、クラッシュは二度と起こりませんでした。

于 2012-12-05T14:01:25.443 に答える