Почему нельзя использовать MPMoviePlayerController более одного раза? - PullRequest
12 голосов
/ 10 октября 2009

В MonoTouch мы столкнулись с этой проблемой с примером Movie Player, так как он будет воспроизводить видео только один раз, но не будет воспроизводить его во второй раз.

Я задаю этот вопрос, чтобы опубликовать ответ, так как он поражает разных людей.

Ответы [ 3 ]

17 голосов
/ 10 октября 2009

MPMoviePlayerController - это синглтон под капотом. Если вы не выполнили надлежащим образом release'd (ObjC) или Dispose () 'd (MonoTouch) и создали второй экземпляр, он либо не будет воспроизводиться, либо воспроизводит только аудио.

Кроме того, если вы подписываетесь на MPMoviePlayerScalingModeDidChangeNotification или MPMoviePlayerPlaybackDidFinishNotification или MPMoviePlayerContentPreloadDidFinishNotification, имейте в виду, что опубликованное NSNotification принимает ссылку на MPMoviePlayer, так что вы всегда будете иметь в виду, что у вас есть ссылка, так что вы будете иметь это, даже если у вас есть ссылка, так что вы будете держать ее под контролем, даже если у вас будет такая возможность, вы даже будете держать ее, даже если у вас будет такая возможность, даже если у вас будет ссылка, даже если вы будете иметь ее, вы будете держать ее под контролем, даже если у вас будет такая возможность, вы будете держать ее под контролем, даже если у вас будет такая возможность, даже если у вас будет ссылка, даже если у вас будет такая возможность, вы будете держать ее под контролем, даже если у вас будет такая возможность, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, даже если у вас будет ссылка, вы будете держать ее под контролем.

Несмотря на то, что Mono's Garbage Collector в конечном итоге включится, это тот случай, когда требуется детерминированное завершение (вы хотите, чтобы ссылка ушла сейчас , а не исчезла, когда GC решит выполнить сбор).

Вот почему вы хотите вызвать метод Dispose () на контроллере и метод Dispose () в уведомлении.

Например:

// Deterministic termination, do not wait for the GC
if (moviePlayer != null){
    moviePlayer.Dispose ()
    moviePlayer = null;
}

Если вы слушали уведомления, в конце вызовите Dispose в обработчике уведомлений, чтобы освободить ссылку, которую он хранит, на ваш MPMoviePlayerController, например:

var center = NSNotificationCenter.DefaultCenter;
center.AddObserver (
    "MPMoviePlayerPlaybackDidFinishNotification"),
    (notify) => { Console.WriteLine ("Done!"); notify.Dispose (); });
1 голос
/ 09 февраля 2010

Не могу увидеть ваш код Nir, и у меня нет прав на редактирование, поэтому снова здесь:

Секрет лежит в endPlay с установкой: moviePlayer.initialPlaybackTime = -1; прежде чем выпустить его. Попробуйте: :)

-(void)playMovie:(NSString *)urlString{ movieURL = [NSURL URLWithString:urlString];          
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];    
moviePlayer.initialPlaybackTime = 0; 
//Register to receive a notification when the movie has finished playing. 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endPlay:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];

moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
moviePlayer.movieControlMode = MPMovieControlModeDefault;
moviePlayer.backgroundColor = [UIColor blackColor];

[moviePlayer play];

}

-(void)endPlay: (NSNotification*)notification{
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
moviePlayer.initialPlaybackTime = -1; 
[moviePlayer stop]; 
[moviePlayer release]; 
} 
0 голосов
/ 04 февраля 2010

Секрет лежит в endPlay с установкой: moviePlayer.initialPlaybackTime = -1; прежде чем выпустить его. Попробуйте это: :)

-(void)playMovie:(NSString *)urlString{
    movieURL = [NSURL URLWithString:urlString]; 
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    moviePlayer.initialPlaybackTime = 0;
    //Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(endPlay:) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:moviePlayer];

    moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
    moviePlayer.movieControlMode = MPMovieControlModeDefault;
    moviePlayer.backgroundColor = [UIColor blackColor];

    [moviePlayer play];

}

-(void)endPlay: (NSNotification*)notification{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    moviePlayer.initialPlaybackTime = -1;
    [moviePlayer stop];
    [moviePlayer release];
}
...