MPMoviePlayerViewController无法播放mp4文件

时间:2012-04-18 19:53:53

标签: iphone mp4 mpmovieplayer

我正在开发一个测试应用程序,它将运行来自互联网的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

3 个答案:

答案 0 :(得分:4)

设置电影播放器​​的控制风格。

[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault];

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

答案 1 :(得分:0)

另一种可能发生这种情况的情况是,正如日志非常有用地告诉你的那样,“AVPlayerItem一次只能占用一个玩家队列中的一个位置”。基本上,当你试图让两个视频同时开始播放时,甚至可以同时与两个视频/ MPMoviePlayerController对象进行交互。

在我的应用程序中,我使用了两个MPMoviePlayerController并继续交换它们,为用户创造了无限移动和不同视频之间交换的错觉。

到目前为止,此工作正常,但我最近添加了一些事件的通知,这些事件应导致视频暂停和恢复。但是我没有意识到我的播放器对象同时都在收听通知,因此试图同时触发“暂停”或“播放”。这导致框架认为我试图同时播放多个视频,并抛出此异常。

我现在要做的就是确保在任何给定点只有一个玩家对象正在收听通知。我的应用程序逻辑只是一个小小的调整。

因此,如果你得到一个奇怪的错误,它不一定是有问题的框架,恶意的操作系统一心想让你的生活变得地狱或者是上帝的行为。它可能只是纯粹的,老式的坏代码。 :)

答案 2 :(得分: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];