1

iPad アプリで 2 つの映画の間でスムーズなクロス フェードを作成しようとしています。ボタンをタップすると、ビジュアルがランダム化され、再生中の映画が次の映画にフェードします。

2 つのムービーを同時に再生することはできないため (ドキュメントから)、単純なクロスフェードは不可能です。これを回避するために、新しいムービーの最初のフレーム (フェードインする) の静止画像を使用します。ムービーの交換を処理するために 2 つのプレーヤーを使用しました。

元の動画を一時停止し、画像に遷移します。ここで、2 番目のムービー (アルファ = 0.0) を追加し、アルファ = 1 になるようにトランジションします。次に、新しいムービーを再生します。これは、新しいムービーが画像の上に移行するときに目立つ暗くなることを除いて、すべて正常に機能します。

静止画像なしでテストしましたが、この移行中に暗くなることはないようです。

スイッチのコードは次のとおりです (if ステートメントの前半)。よく見るとかなり奇妙に見えますが、必要なものに最も近づけた方法です。

たぶん、このタスクを実行するためのより良い方法がありますか? 前もって感謝します :)

- (void) switchMovie;
{

NSURL *movieImageUrl = [movieImageUrlArray objectAtIndex:index];
NSData *data = [NSData dataWithContentsOfURL:movieImageUrl];
UIImage *movieImage = [[UIImage alloc] initWithData:data];
UIImageView *image = [[UIImageView alloc] initWithImage:movieImage];

image.alpha = 0.0f;
[self addSubview:image];

if (moviePlayer1Playing) {

moviePlayer1Playing = NO;
moviePlayer2Playing = NO;

[moviePlayer1 pause]; //pausing later in the method caused a crash, stopping causes a crash.

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:UIViewAnimationCurveEaseIn
                 animations:^{

                     image.alpha = 1.0f;             //fade in still of first frame of new movie

                 } completion:^(BOOL finished) {

                     [moviePlayer1 release];   //release original movie.

                     moviePlayer2 = [[MPMoviePlayerController alloc] initWithContentURL:[movieUrlArray objectAtIndex:index]]; 

                     moviePlayer2.shouldAutoplay = NO;
                     [moviePlayer2 prepareToPlay];
                     [moviePlayer2 setControlStyle:MPMovieControlStyleNone];
                     moviePlayer2.scalingMode = MPMovieScalingModeAspectFill;
                     [moviePlayer2.view setFrame:CGRectMake(0, 0, 1024 , 768)];
                     moviePlayer2.view.backgroundColor = [UIColor clearColor];
                     moviePlayer2.view.alpha = 0.0;
                     [self addSubview:moviePlayer2.view];

                     [UIView animateWithDuration: 3.0 
                                           delay: 0.0 
                                         options: UIViewAnimationCurveLinear  
                                      animations:^(void){ 

                                         moviePlayer2.view.alpha = 1.0f;
                                         //During this transition the view goes dark half-way through, before lightening again.

                                      } completion:^ (BOOL finished) {

                                          [moviePlayer2 play];
                                          moviePlayer2Playing = YES;  
                                          moviePlayer1Playing = NO;


                                      }];

                 }]; 


}
4

1 に答える 1

1

表示されている黒はムービー プレーヤーの背景であるため、静止画に UIImageView を使用する代わりに、ムービー プレーヤーの背景を目的の静止画に設定する必要があります。

UIImageView *stillImageView = [UIImageView alloc]initWithImage:stillImage];
stillImageView.frame = self.moviePlayer.backgroundView.frame;

[self.moviePlayer.backgroundView addSubview:stillImageView];
[stillImageView release];
于 2012-04-22T01:29:42.773 に答える