2

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

4

3 回答 3

4

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

[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault];

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

于 2012-04-18T20:53:38.597 回答
0

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

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

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

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

因此,如果您遇到奇怪的错误,不一定是有问题的框架、一心想让您的生活陷入困境的恶意操作系统或上帝的行为。它可能只是纯粹的、好的老式坏代码。:)

于 2012-05-23T21:25:30.057 回答
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];
于 2012-06-13T14:53:04.557 回答