加载UIView时立即播放视频

时间:2010-12-20 21:32:03

标签: objective-c ipad mpmovieplayercontroller exc-bad-access

你好!我正在写一个iPad应用程序,我需要能够在UIView加载时播放视频。但是,如果我在初始化之后尝试在任何地方向我的MPMoviePlayerController发送消息,那么我得到了一个BAD_EXC_ACCESS。我从我的* .h文件中删除了MPMediaPlayerController,然后完全在实现文件中声明它,现在我收到了代码下方底部的消息。构建和分析中没有关于内存泄漏(或任何问题)的问题,我找不到任何关于此的帖子。这是我的代码:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }

 NSString *url = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"];
 MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
 NSLog(@"%@", movie);
 movie.view.frame = CGRectMake(5, 0, 1035, 768);
 movie.view.contentMode = UIViewContentModeScaleToFill;
 [[movie view] setCenter:CGPointMake(movie.view.center.x-10, movie.view.center.y)];
 [movie setControlStyle:MPMovieControlStyleNone];
    [movie setShouldAutoplay:YES];
 [[self view] addSubview:[movie view]];

    return self;
    }

“movie”的NSLog给出“MPMoviePlayerController:0x1b77f0”,但是崩溃时的错误消息是“ * - [MPMoviePlayerController playbackState]:消息发送到解除分配的实例0x1473a0”。帮助

4 个答案:

答案 0 :(得分:0)

根据文档,看起来电影视图的框架需要与其父视图相匹配。还可以尝试将代码移出initWithNibName:bundle:into viewDidLoad:

- (void)viewDidLoad {
     [super viewDidLoad];

     UIView *movieContainer = [[UIView alloc] initWithFrame:CGRectMake(5, 0, 300, 400)];
     //Do any other positioning of the view you would like

     NSString *path = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"]; 
     NSURL *url = [NSURL fileURLWithPath:path];
     MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:url];
     movie.view.frame = movieContainer.bounds;  //Make sure this is the bounds of its parent view
     movie.scalingMode = MPMovieScalingModeFill;
     movie.controlStyle = MPMovieControlStyleNone;
     movie.shouldAutoplay = YES;

     [movieContainer addSubview:movie.view];
     [self.view addSubview:movieContainer];

     [movieContainer release];
}

最后一个建议是保留电影的引用,以便在取消分配视图控制器后可以取消分配

答案 1 :(得分:0)

我建议您在viewDidLoad中创建您的MoviePlayer,然后在viewDidAppear制作电影,以获得最佳效果。

答案 2 :(得分:0)

好吧,所以我有另一个MPMoviePlayerController实例,它之前被解除分配,但是当我尝试创建另一个MPMoviePlayerController实例时,发送给这个实例的所有消息都被发送到解除分配的实例,导致内存问题。所以我刚刚删除了我发布第一个实例的部分,它完全正常。我现在的问题是:有没有办法解除分配这个第一个实例,以便在不需要它时不会对内存造成负担?我觉得应该有一个更优雅的解决方案来解决这个问题。我需要经常在这个应用程序中播放视频。

答案 3 :(得分:0)

几个星期前我找到了这个解决方案并忘记了这篇文章。我没有成功发布MPMoviePlayerController。对于那些好奇的人,为了释放MPMoviePlayerController,我们必须首先从NSNotificationCenter中删除通知(如果已经设置),停止电影(即使它已经完成播放),然后释放它。我之前没有在我的第一个MPMoviePlayerController的应用程序中这样做,所以它试图引用解除分配的实例。电影播放完毕后,这里是成功发布电影的代码:

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:movie];
[movie.view removeFromSuperview];
[movie stop];
[movie release];