2011-07-21 58 views
1

我正在使用內置的MPMoviePlayerController播放視頻。使用兩個MPMoviePlayerControllers時遇到問題(請注意,沒有兩個視頻在同一時間播放)。我可以在第一個控制器上播放盡可能多的視頻,當我完成後處理它,然後分配另一個MPMoviePlayerController。當我設置controlStyle第二控制器上,我得到MPMoviePlayer錯誤的激活狀態?

終止應用程序一個SIGABRT由於未捕獲的異常「NSInternalInconsistencyException」,理由是:「電影播放器​​已經錯激活狀態(1)

我已搜查在線並發現堆棧溢出的類似問題。那傢伙說他忘記了刪除回放完成通知。我相信我已經正確使用[[NSNotificationCenter defaultCenter] removeObserver:self];

我仍然崩潰。相當令人沮喪!

我不明白爲什麼它不可能使用兩個控制器,只要他們不是在同一時間播放。我寧願不必深入到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方法內有movieplayer的release和nil。這並沒有被調用,視圖被從它的超級視圖中移除,所以我只是在我隱藏視頻的同時發佈了一個版本。

我還是有點困惑,爲什麼問題首先發生,因爲我使用了兩個單獨分配的MPMoviePlayers。

tldr:確保第一個MPMoviePlayer在嘗試分配第二個MPMoviePlayer之前完全釋放。

+0

好的,所以你的問題是內存管理,這是我的第一位。我沒有測試我的代碼,只有你能做到這一點,但你結束了我指向你的地方。 – MiguelB

0

我想我看到你的問題。你甚至在分配之前發佈player。基本上,第一次編譯器通過你的代碼,它看到player保留計數-1(因爲release調用),然後當你分配它時(因爲new調用)再次上升到0。因此,當您第一次嘗試設置任何屬性時,沒有對象將屬性設置爲(player從不具有保留計數1)。 你應該做的是檢查是否存在player,只有當它已經存在,然後你釋放它。

嘗試使此更改您的makePlayer方法:

- (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]; 
} 

編輯:略作變化。 player是一個實例變量,所以你實際上必須做的是檢查它是否已經被設置爲一個對象。

+0

不幸的是,這並沒有解決問題:(我真的很難在這個問題上,我希望蘋果在設計這門課的時候做得更好,對於我看到的問題的數量並不感到興奮。另外,我相信玩家=零和釋放線路切換在你上面的例子 – brandon