0

私は、ユーザーが画像をクリックするたびに再生したい映画へのリンクを含むXMLフィードを含むアプリケーションを構築しています。

そのために、私はMPMoviePlayerViewControllerを使用しています。シミュレーターでアプリをテストすると、これまでのところ期待どおりの結果が得られましたが、iPhoneでアプリをテストすると、プレーヤーは正しく再生されますが、音は出ません。

私はインターネットを調べましたが、いくつかの記事によると、アプリのパフォーマンスはシミュレーターが提供するパフォーマンスとは大きく異なるとのことです。そのため、Instrumentsで「リーク」テストを行いました。これにより、映画の再生を開始するたびに、一部のバイトがドロップまたはリークすることがわかりました。それは突然の音の低下と関係があるのでしょうか?もしそうなら、私はそれをどのように解決しますか?

iPhoneでアプリをテストするのは初めてなので、アプリのパフォーマンスがいかに悪いかを見てかなりショックを受けました。これがmovieplayer-partのコードです。

#pragma mark Video Controls
-(void)playVideo:(id)sender{
    moviePlaying=TRUE;
    MPMoviePlayerViewController *playerViewController;
    playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[data objectForKey:@"[att]url"]]];


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[playerViewController moviePlayer]];
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] init] autorelease];
    player = [playerViewController moviePlayer];

    [self.view addSubview:playerViewController.view];
    player.controlStyle = MPMovieControlStyleDefault;
    player.shouldAutoplay = YES;
    [player setFullscreen:YES animated:YES];
} 

- (void)moviePlayBackDidExitFullscreen:(NSNotification*)notification{
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    moviePlaying=FALSE;
    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
#pragma mark VideoControls End

問題を解決していただければ幸いです。

前もって感謝します、

/ Brinck10

4

1 に答える 1

1

ここには非常に深刻な混乱があります。MPMoviePlayerViewControllerとMPMoviePlayerControllerの両方を作成しないでください。どちらか一方を使用してください。そして、これらの行は意味がありません:

MPMoviePlayerController *player = 
    [[[MPMoviePlayerController alloc] init] autorelease];
player = [playerViewController moviePlayer];

MPMoviePlayerControllerを作成してプレーヤーに割り当てますが、それを破棄して、既存のMPMoviePlayerViewControllerのmoviePlayerを置き換えます。

10ヤード戻ってパントしましょう。映画を再生したり、サウンドをストリーミングしたりする簡単な方法は、MPMoviePlayerViewControllerを使用することです。これはビューコントローラなので、UIViewControllerを使用する場所に押し込むだけです。最も簡単なのは、モーダルで表示することです。

NSURL* m = // whatever;
MPMoviePlayerViewController* mpvc = 
    [[MPMoviePlayerViewController alloc] initWithContentURL: m];
[self presentModalViewController:mpvc animated:YES];
[mpvc release];

これにより、MPMoviePlayerControllerとそのビューが作成され、フルスクリーンモードでのみシバン全体が表示されます。シンプルで簡単。ユーザーが[完了]をタップすると、モーダルビューも表示されなくなります。

MPMoviePlayerControllerの使用はより複雑です。UIViewControllerではありません。しかし、それは見解を持っています。ユーザーに何かを見せたい場合のあなたの仕事は、そのビューを取得し、フレームを付けて、インターフェースに貼り付けることです。

NSURL* m = // whatever;
MPMoviePlayerController* mp = 
    [[MPMoviePlayerController alloc] initWithContentURL:m];
self.mpc = mp; // property with retain policy
[mp release];
self.mpc.view.frame = CGRectMake(10, 10, 300, 230);
[self.view addSubview:self.mpc.view];

これにより、ムービービューがインターフェイスの一部になります。映画が本物の映画である場合、ユーザーはフルスクリーンモードに切り替えるかどうかを自由に切り替えることができます。映画が単なる音である場合、ユーザーにはそれを行う方法がありません。停止/移動ボタンとスライダーだけがあります。

いずれにせよ、ストーリーのどこかにMPMoviePlayerControllerがあるので、通知に登録したり、再生/停止するように指示したりできます。ただし、2つのアプローチを混同したり融合したりしないでください。それがおそらくここでのすべての問題の原因です。

于 2011-01-11T17:47:02.520 に答える