为什么不可能多次使用MPMoviePlayerController?

问题描述:

在MonoTouch中,我们遇到了这个电影播放器​​示例的问题,因为它只播放一次视频,但不会再播放一次。为什么不可能多次使用MPMoviePlayerController?

我在问这个问题发表了一个答案,因为它已经击中了各种各样的人。

MPMoviePlayerController是引擎盖下的单身人士。如果您没有正确释放'd(ObjC)或Dispose()'d(MonoTouch),并且您创建了第二个实例,它将不会播放或仅播放音频。

此外,如果您订阅MPMoviePlayerScalingModeDidChangeNotification或MPMoviePlayerPlaybackDidFinishNotification或MPMoviePlayerContentPreloadDidFinishNotification,予以警告,张贴NSNotification需要到的MPMoviePlayerController的引用一样,所以,如果你把它周围,你就会有一个参考的球员。尽管Mono的垃圾收集器最终会启动,但这是一个需要确定性终止的情况(当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(); }); 

秘密在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]; 
} 

无法看到你的代码尼尔和我没有编辑权限,所以这里要再次重申:

与设定端隙秘密规定: 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]; 
}