iOS: как использовать MPMoviePlayerController

Я создал пустой проект (iOS) и поместил его в мой viewDidLoad:

NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"];
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer play];

Когда приложение запускается, я вижу только белый экран с сообщениями об ошибках в журнале:

 <Error>: CGContextSaveGState: invalid context 0x0
 <Error>: CGContextClipToRect: invalid context 0x0
 <Error>: CGContextTranslateCTM: invalid context 0x0
 <Error>: CGContextDrawShading: invalid context 0x0
 <Error>: CGContextRestoreGState: invalid context 0x0
Warning: Attempt to present <MPMoviePlayerViewController: 0x821e3b0> on <ViewController: 0x863aa40> whose view is not in the window hierarchy!

... и куча строк, касающихся отключения автозапуска. Я особенно не понимаю строки о том, что представление не является частью иерархии, так как это пустой iOS-проект "Single View Application", а код находится в ViewController.m. Это в иерархии представлений.

Я точно знаю, что сам файл фильма не является проблемой, потому что я получил его из примера кода Apple на MPMoviePlayer. И хотя я (казалось бы) попробовал все, что написано в примере, я просто не смог заставить плеер работать.

Вот еще одна попытка, на этот раз с MPMoviePlayerController (не MPMoviePlayerViewController):

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player setContentURL:url];
[player setMovieSourceType:MPMovieSourceTypeFile];

[[player view] setFrame:self.view.bounds];
[player view].backgroundColor = [UIColor greenColor];

player.scalingMode = MPMovieScalingModeNone;
player.controlStyle = MPMovieControlModeDefault;
player.backgroundView.backgroundColor = [UIColor whiteColor];
player.repeatMode = MPMovieRepeatModeNone;

[self.view addSubview: [player view]];
[player play];

Аналогичный результат, с белым экраном и ошибками. Пожалуйста помоги....

4 ответа

Решение

Оказывается, все, что нам нужно сделать, это:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"];
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];
  • movieController это пример MPMoviePlayerViewController объявлено в.h файле.

  • Важно: при определении URL используйте NSURL URLWithString метод, если вы хотите получить доступ к файлу через сеть и использовать NSURL fileUrlWithPath если у вас есть файл локально!

  • [movieController.moviePlayer play] не требуется, и игрок будет запускаться независимо от того, если вы не установили автозапуск на NO, но я заметил, что если вы установите play в нем это начинается немного быстрее. Это может быть просто совпадением.

  • Если вы хотите знать, когда пользователь нажал кнопку "Готово" (игрок будет автоматически удален), вы должны знать, что -viewDidAppear вызывается на контроллере представления, который появляется, когда игрок уволен. Вы могли бы установить BOOL переменная, когда игрок запускается и проверьте BOOL в вашем -viewDidAppear так что вы знаете, что -viewDidAppear был вызван, потому что игрок был уволен. В качестве альтернативы вы можете зарегистрироваться на MPMoviePlayerDidExitFullScreen уведомление, но это не сработало для меня.

ИЛИ, если это не работает, вы можете просто сделать следующее

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"something" ofType:@"mp4"]]];
[self.moviePlayer.view setFrame:CGRectMake(0, 0, 320, 320)];
[self.moviePlayer play];
[self.view addSubview:self.moviePlayer.view];
  • self.movieplayer является экземпляром MPMoviePlayerController (не MPMoviePlayerViewController). По моему опыту, важно объявить его как свойство (например, так: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;), а не простой ивар, потому что иногда он просто не работает, если это ивар

  • установка рамки также важна, потому что, если мы не установим ее, видео не будет отображаться вообще. Рамка может быть чем угодно, если вы определяете, что находится в пределах вашего обзора

  • Важно: Как и выше, при определении URL используйте NSURL URLWithString метод, если вы хотите получить доступ к файлу через сеть и использовать NSURL fileUrlWithPath если у вас есть файл локально!

Вы должны попробовать это......

NSString *path = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp4"];
    player = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:path]];
    [player.view setFrame:CGRectMake(0, 0, 320, 320)];
    [self presentMoviePlayerViewControllerAnimated:player];
    [player.moviePlayer play];
     [self.view addSubview:player.view];

Попробуй это:

//Hello guise :- complete process here.

//1. add framework in .h 
MediaPlayer/MediaPlayer.h

//2.add delegate in @interface, MPMediaPickerControllerDelegate

//3.@property (retain, nonatomic) MPMoviePlayerViewController *moviePlayerController;

//4.and synthesize in .m - @synthesize moviePlayerController;

//5.IN - tableViewdelegateMethod

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{    

    //given path for song
    NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory1 = [paths1 objectAtIndex:0];
    NSString *strPath = [NSString stringWithFormat:@"%@/%@",documentsDirectory1,[movieArray objectAtIndex:indexPath.row]];
    NSLog(@"strPath %@",strPath);
    //path for song.
    //convert path in NSURL.
    NSURL *videosURL = [NSURL fileURLWithPath:strPath];
    moviePlayerController = [[MPMoviePlayerViewController alloc]initWithContentURL:videosURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayerController];
    [moviePlayerController.moviePlayer play];
}

//play song on UITableViewCell click.

Попробуй добавить

[player prepareToPlay];

после

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];

Вы можете узнать больше о MPMoviePlayerController в документации Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerControl

Другие вопросы по тегам