2011-07-21 9 views
1

私はビデオを再生するためにMPMoviePlayerControllerを使用しています.2つのMPMoviePlayerControllersを使用しているときに問題が発生しました(2つのビデオは全く同じ時間に再生されません)。私は最初のコントローラーでできるだけ多くのビデオを再生し、完了したらそれを破棄し、別のMPMoviePlayerControllerを割り当てます。ムービープレーヤーが間違った活性化状態は、(1)MPMoviePlayerの起動状態が間違っていますか?

私が検索しました」:私は2番目のコントローラにcontrolStyleを設定するや否や、私がキャッチされない例外により「NSInternalInconsistencyException」、理由にアプリを終了

でSIGABRTを取得しますスタックオーバーフローで同様の問題が検出されました。その男は、再生完了の通知を削除するのを忘れてしまったと言いました。私はこれを[[NSNotificationCenter defaultCenter] removeObserver:self]を使って正しく行ったと信じています。

私はまだクラッシュします。むしろイライラする!

2人のコントローラーが同時に再生されていない限り、そのコントローラーを使用できない理由はわかりません。 AVPlayerにビデオを取り込むだけではなくてもいいです。

ありがとうございます!

編集:controlStyleの割り当てをコメントアウトすると、クラッシュする可能性があります。以下は、呼び出されたコールスタックとクラスからの重要なメソッドです。

- (void) makePlayer; 
{ 
[player.view removeFromSuperview]; 
[player release]; 
player = [MPMoviePlayerController new]; 
player.view.frame = self.bounds; 
player.view.hidden = YES; 
player.controlStyle = MPMovieControlStyleNone; 
player.scalingMode = MPMovieScalingModeNone; 
[self addSubview: player.view]; 
} 

- (void) dealloc; 
{ 
[[NSNotificationCenter defaultCenter] removeObserver: self]; 
[player.view removeFromSuperview]; 
[player release]; 
[super dealloc]; 
} 

- (void) setMovieByName: (NSString *) name; 
{ 
[self makePlayer]; 
player.shouldAutoplay = NO; 
[player setContentURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: name ofType: @"mov"]]]; 
[player stop]; 
[player prepareToPlay]; 
[[NSNotificationCenter defaultCenter] removeObserver: self]; 
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(movieDimensionsKnown:) name:MPMovieNaturalSizeAvailableNotification object: player]; 
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object: player]; 
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object: player]; 
} 

- (void) playbackFinished: (NSNotification *) n 
{ 
player.view.hidden = YES; 
if ([delegate respondsToSelector: @selector(moviePlayerImageViewPlaybackDidFinish:)]) 
    [delegate moviePlayerImageViewPlaybackDidFinish: self]; 
} 
+0

ムービーコントローラの作成と廃棄の正確さを知るために、いくつかのコードを示す必要があります。ちなみに、あなたがcontrolStyleを設定しないとどうなりますか?あなたはまだ例外がありますよね? – MiguelB

答えて

0

ちょうど私自身の問題を解決しました。私は、ビデオビューのviewDidUnloadメソッドの中でムービープレイヤーのリリースと無しを持っていました。これはスーパービューからビューが削除されて呼び出されないので、私は同時にビデオを隠しているときにリリースを投げなければなりませんでした。

2つの別々に割り当てられたMPMoviePlayersを使用していたため、なぜ最初に問題が発生したのか、まだ少し混乱しています。

tldr:最初のMPMoviePlayerが完全に解放されてから2番目のMPMoviePlayerが割り当てられていることを確認してください。

+0

あなたの問題は、最初の私のポイントだったWASのメモリ管理でした。私は自分のコードをテストしませんでしたが、あなただけがそれを行うことができますが、あなたは私があなたを指していた場所に行きませんでした。 – MiguelB

0

私はあなたの問題を見ると思います。割り当てようとする前にplayerを解放しています。基本的に、コンパイラが初めてコードを実行したときには、playerrelease呼び出しのため)の保持カウントが得られ、new呼び出しのため、割り当て時に再び0になります。したがって、初めてプロパティを設定しようとすると、プロパティを設定するオブジェクトはありません(playerには1の保持カウントはありません)。 あなたがするべきことは、playerの存在を確認し、それがすでに存在する場合のみそれを解放してから解放することです。

- (void) makePlayer { 

if (player != nil) { 

[player.view removeFromSuperview]; 
player = nil; 
[player release]; 

} 

player = [MPMoviePlayerController new]; 
player.view.frame = self.bounds; 
player.view.hidden = YES; 
player.controlStyle = MPMovieControlStyleNone; 
player.scalingMode = MPMovieScalingModeNone; 
[self addSubview: player.view]; 
} 

EDIT:メイドわずかな変化

はあなたmakePlayerメソッドにこの変更を作ってみましょう。 playerはインスタンス変数なので、実際にはオブジェクトに既に設定されているかどうかを確認する必要があります。

+0

悲しいことに、これで問題は解決されませんでした。(私は本当にこの問題に悩まされています。アップルがこのクラスを設計したほうがいいと思います。また、私はプレーヤー= nilと上記の例では、リリースラインが切り替わったと信じています。 – brandon

関連する問題