2012-04-18 97 views
2

我正在從一個測試應用程序運行一個mp4文件從互聯網。 代碼:MPMoviePlayerViewController無法播放mp4文件

-(IBAction)playRemoteVideo 
{ 

    NSString *mp4File = @"http://archive.org/download/Pbtestfilemp4videotestmp4/video_test_512kb.mp4"; 

    MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:mp4File]]; 
    [self presentMoviePlayerViewControllerAnimated:playerController]; 
    playerController.moviePlayer.movieSourceType=MPMovieSourceTypeStreaming; 

    [playerController.moviePlayer play]; 
    [playerController release]; 
    playerController=nil; 
} 

當我運行應用程序,玩遊戲者試圖加載了一段視頻的視頻,但我得到了在控制檯上

2012-04-18 22:45:11.309 VideoPlayer[891:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem can occupy only one position in a player's queue at a time.' 
*** First throw call stack: 
(0x1df1052 0x1333d0a 0x27cfb31 0x27cbb2a 0x27e45cc 0x103b73 0xd4e6a 0x2ff2445 0x2ff44f0 0x1d28833 0x1d27db4 0x1d27ccb 0x16d8879 0x16d893e 0x24ea9b 0x1d12 0x1c85) 
terminate called throwing an exception(gdb) 

這個異常後如果我執行相同例如,帶有m3u8文件的代碼;

http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 

我可以得到視頻運行,但同樣不適用於mp4文件。

你知道爲什麼我得到這個異常和我的代碼有什麼問題嗎?

我運行iPhone模擬器應用和我的XCode 4.2 問候 Tugrul

回答

4

將電影播放器​​的控件樣式像這樣。

[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault]; 

此外,本地文件具有MPMovieSourceTypeFile,而不是MPMovieSourceTypeStreaming屬性集。

+0

嗨,謝謝你現在正在工作 – tguclu 2012-04-18 21:19:40

+0

記得標記爲已接受。 – CodaFi 2012-04-18 22:03:57

+0

我不能使用這種方法。控件需要定製 - 這是絕對必要的。沒有辦法解決這個問題沒有辦法解決這個問題嗎?顯然這是一個框架問題,但是沒有其他辦法嗎?對不起,如果我聽起來很緊張,但我完全沮喪於我對這個問題的解決方案的所有搜索。 – 2012-05-23 16:20:24

0

這種情況可能發生的另一種場景是,當日志非常有用地告訴你,「AVPlayerItem一次只能在玩家隊列中佔據一個位置」。基本上,當您嘗試讓兩個視頻同時開始播放時,甚至是同時與兩個視頻/ MPMoviePlayerController對象交互時。

在我的應用程序中,我使用了兩個MPMoviePlayerController,並不停地交換它們,以創建無限移動和交換不同視頻的用戶的錯覺。

到目前爲止這樣工作正常,但我最近添加了一些事件的通知,這些事件會導致視頻暫停和恢復。但是我並沒有意識到我的播放器對象同時都在收聽通知,因此試圖同時觸發「暫停」或「播放」。這導致框架認爲我試圖同時播放多個視頻,並拋出此異常。

我現在要做的只是確保只有一個玩家對象在任何給定的點上收聽通知。只是我的應用程序邏輯的一個小調整。

所以,如果你得到一個奇怪的錯誤,它不一定是有問題的框架,惡意的操作系統一心要讓你的生活地獄或神的行爲。它可能只是純粹的,老式的糟糕代碼。 :)

0

我知道這個錯誤。試試這裏的代碼。

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: url]; 
    self.movieController = player; 
    self.movieController.fullscreen = YES; 
    self.movieController.controlStyle = MPMovieControlStyleDefault; 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:self.movieController]; 
    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerDidExitFullscreenNotification 
               object:self.movieController]; 
    [self.movieController prepareToPlay]; 
    [self.movieController.view setFrame: self.view.bounds]; // player's frame must match parent's 
    [self.view addSubview: self.movieController.view]; 

    // ... 
    [self.movieController play];