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

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, а код находится в 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];

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

4b9b3361

Ответ 1

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

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;), а не простой ivar, потому что иногда он просто не работает, если он ivar

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

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

Ответ 2

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

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];

Ответ 4

Попробуйте следующее:

//Hello guise :- complete process here.

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

//2.add delegate in @interface, MPMediaPickerControllerDelegate

//[email protected] (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.