Подтвердить что ты не робот

Почему нельзя использовать MPMoviePlayerController более одного раза?

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

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

4b9b3361

Ответ 1

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

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

Несмотря на то, что Mono 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 (); });

Ответ 2

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

Тайна лежит в концеPlay с установкой: 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]; 
} 

Ответ 3

Тайна лежит в концеPlay с установкой: 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];
}