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シミュレーターでアプリケーションを実行し、XCode4.2を使用しています。よろしくTugrul

4

3 に答える 3

4

ムービープレーヤーのコントロールスタイルをこのように設定します。

[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault];

また、ローカルファイルには、MPMovieSourceTypeStreamingプロパティではなく、MPMovieSourceTypeFileが設定されています。

于 2012-04-18T20:53:38.597 に答える
0

これが発生する可能性のあるもう1つのシナリオは、ログが非常に役立つように、「AVPlayerItemはプレーヤーのキュー内の一度に1つの位置しか占有できない」場合です。基本的に、2つのビデオを同時に再生し始めようとしている場合、または2つのビデオ/MPMoviePlayerControllerオブジェクトと同時に対話している場合です。

私のアプリでは、2つのMPMoviePlayerControllerを使用し、それらを交換し続けて、ユーザーが異なるビデオ間を無限に移動したり交換したりするような錯覚を作り出します。

これは今のところ問題なく機能していましたが、最近、動画が一時停止および再開される結果となるいくつかのイベントの通知を追加しました。ただし、両方のプレーヤーオブジェクトが同時に通知をリッスンしていることに気づかなかったため、「一時停止」または「再生」のいずれかを同時にトリガーしようとしました。これにより、フレームワークは、私が同時に複数のビデオを再生しようとしていると見なし、この例外をスローしました。

私が今しなければならなかったのは、特定の時点で1つのプレーヤーオブジェクトだけが通知をリッスンしていることを確認することだけでした。アプリケーションロジックを少し調整しました。

したがって、奇妙なエラーが発生した場合、問題を抱えているのはフレームワークである必要はなく、悪意のあるオペレーティングシステムがあなたの人生を地獄にすることや神の行為である必要はありません。それは純粋で古き良き悪いコードかもしれません。:)

于 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 に答える