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;
}];
}];
}