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];
Аналогичный результат, с белым экраном и ошибками.
Пожалуйста, помогите....
Ответы
Ответ 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];
Ответ 3
Попробуйте добавить
[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/MPMoviePlayerController
Ответ 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.