Воспроизведение видео сразу после загрузки UIView - PullRequest
0 голосов
/ 21 декабря 2010

Хауди! Я пишу приложение для iPad, и мне нужно иметь возможность воспроизводить видео при загрузке UIView. Тем не менее, я получаю BAD_EXC_ACCESS, если я пытаюсь отправить сообщение своему MPMoviePlayerController в любом месте после его инициализации. Я удалил MPMediaPlayerController из моего * .h файла, затем объявил его полностью в файле реализации, и теперь я получаю сообщение внизу под моим кодом. В Build and Analyze нет проблем с утечками памяти (или какими-либо другими проблемами), и я не могу найти никаких сообщений по этому поводу. Вот мой код:

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

NSLog «movie» выдает «MPMoviePlayerController: 0x1b77f0», но тогда сообщение об ошибке при сбое имеет вид «* - [MPMoviePlayerController playState]: сообщение отправлено на освобожденный экземпляр 0x1473a0». Помощь

Ответы [ 4 ]

0 голосов
/ 25 января 2011

Я нашел решение несколько недель назад и забыл об этом посте.Я не смог успешно выпустить MPMoviePlayerController.Для тех, кому интересно, чтобы выпустить MPMoviePlayerController, мы должны сначала удалить уведомление из NSNotificationCenter (если он был установлен), остановить фильм (даже если он закончил воспроизведение), ТО освободить его.Я не делал этого ранее в приложении с моим первым MPMoviePlayerController, поэтому он пытался ссылаться на освобожденный экземпляр.Когда воспроизведение фильма завершено, вот код для успешного выпуска фильма:

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:movie];
[movie.view removeFromSuperview];
[movie stop];
[movie release];
0 голосов
/ 21 декабря 2010

Я бы предложил создать MoviePlayer в viewDidLoad, а затем в viewDidAppear воспроизвести фильм для достижения наилучших результатов.

0 голосов
/ 21 декабря 2010

Хорошо, поэтому у меня есть еще один экземпляр MPMoviePlayerController, который был освобожден ранее, но когда я пытаюсь создать другой экземпляр MPMoviePlayerController, все сообщения, отправленные на этот экземпляр, отправляются в освобожденный экземпляр, что приводит к проблеме с памятью. Поэтому я просто удалил часть, где я выпустил первый экземпляр, и она отлично работает. Мой вопрос сейчас заключается в следующем: есть ли способ освободить этот первый экземпляр, чтобы не было нагрузки на память, когда она не нужна? Я чувствую, что должно быть более элегантное решение этой проблемы. Мне нужно будет часто проигрывать видео в этом приложении.

0 голосов
/ 21 декабря 2010

Согласно документации, похоже, что кадр представления фильма должен совпадать с видом его родителя.Также попробуйте переместить ваш код из 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];
}

Последнее предложение - сохранить ссылку на фильм, чтобы можно было освободить его после освобождения контроллера представления

...