2012-10-10 9 views
30

Został utworzony pusty projekt (iOS) i umieścić w moim viewDidLoad:iOS: Jak korzystać MPMoviePlayerController

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

Kiedy aplikacja uruchamia wszystko mam to biały ekran z komunikatami o błędach w log:

<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! 

... i kilka wierszy dotyczących wyłączenie autoodtwarzania. Szczególnie nie rozumiem linii o widoku nie będącym częścią hierarchii, ponieważ jest to pusty projekt "iOS" z pojedynczą przeglądarką, a kod jest w ViewController.m. Jest w hierarchii widoku.

Wiem na pewno, że sam plik filmu nie jest problemem, ponieważ dostałem go z przykładowego kodu Apple na MPMoviePlayer. I chociaż (na pozór) próbowałem wszystkiego, co napisałem w próbce, po prostu nie mogłem zmusić gracza do pracy.

Oto kolejna próba, tym razem z MPMoviePlayerController (nie 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]; 

Podobny wynik, z białego ekranu i błędów. Proszę pomóc ....

+0

Spróbuj umieścić go w 'viewDidAppear'. –

+0

Umieszczenie go w widokuDidAppear rozwiązało błędy kontekstu, dziękuję, ale nadal nie dostaję odtwarzacza, tylko biały ekran –

Odpowiedz

89

Okazuje się, że wszystko, co mamy do zrób to:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"]; 
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]; 
[self presentMoviePlayerViewControllerAnimated:movieController]; 
[movieController.moviePlayer play]; 
  • movieController jest instancją MPMoviePlayerViewController zadeklarowane w pliku .h.

  • Ważne: podczas definiowania URL użyć URLWithString metodę bibliotece NSURL, jeśli chcesz uzyskać dostęp do plików przez sieć i korzystać bibliotece NSURL na fileUrlWithPath jeśli masz plik lokalnie!

  • [movieController.moviePlayer play]nie jest wymagane a gracz rozpocznie niezależnie jeśli nie ustawić autoodtwarzanie na no, ale zauważył, że jeśli umieścisz play w nim zaczyna nieco szybciej. To może być tylko zbieg okoliczności.

  • Jeśli chcesz wiedzieć gdy użytkownik wcisnął przycisk zrobione (gracz zostanie odrzucony automatycznie) należy wiedzieć, że -viewDidAppear nazywa na kontrolerze widoku, który pojawia się, gdy gracz zostaje odrzucona. Możesz ustawić zmienną BOOL, kiedy gracz rozpocznie i sprawdzi, czy BOOL jest w twoim -viewDidAppear, więc wiesz, że -viewDidAppear zostało wywołane, ponieważ gracz został zwolniony. Alternatywnie możesz zarejestrować się na powiadomienie MPMoviePlayerDidExitFullScreen, ale to nie zadziałało.

OR, jeśli to nie działa po prostu wykonaj następujące czynności

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 jest instancją MPMoviePlayerController (nie MPMoviePlayerViewController). Z mojego doświadczenia wynika, że ​​jest to raczej właściwość (jak: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;), a nie zwykły ivar, ponieważ czasami to po prostu nie działa, jeśli jest to ivar

  • ustawienie ramki jest również ważne, ponieważ jeśli nie ustawiaj, wideo nie pojawi się w ogóle. Rama może być coś tak długo, jak to, co definiuje się w granicach widoku

  • Ważne: Jak wyżej, podczas definiowania URL użyć URLWithString metodę bibliotece NSURL, jeśli chcesz uzyskać dostęp do pliku poprzez sieć i użyj NSURL fileUrlWithPath, jeśli masz plik lokalnie!

+0

Próbowałem już tego kodu i widzę tylko wideo, gdy dodam go do subskrybowania w ten sposób: [self.view addSubview: _movieController.view]; Ale z jakiegoś powodu górny skruber znajduje się kilka pikseli dalej niż zwykle na pasku stanu. Czy istnieje sposób, aby to naprawić? I dostaję te błędy, jak pokazano w tym pytaniu. http://stackoverflow.com/questions/12822420/ios-how-to-use-mpmovieplayercontroller Co robię źle? – vnchopra

1

Spróbuj dodać

[player prepareToPlay]; 

po

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

Możesz przeczytać więcej o MPMoviePlayerController w dokumentacji Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

+3

To powinien być komentarz, a nie odpowiedź. Z dokumentów, które właśnie połączono, ale oczywiście nie przeczytałeś: "Jeśli odtwarzacz filmów nie jest jeszcze gotowy do gry po wywołaniu metody odtwarzania, ta metoda automatycznie wywoła tę metodę". To nie może być problem. Problem polega na tym, że obecny kontekst CoreGraphics to 'NULL' w momencie, gdy OP próbuje zainicjować odtwarzanie. –

+0

Nawet z próbką w opublikowanych dokumentach (w części Przegląd u góry jest kilka wierszy kodu, które prawdopodobnie są minimalnym kodem, aby działało), to nie działa. –

1

Spróbuj tego:

//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. 
+0

erhm co to za film? – KennyVB

8

Musisz spróbować tego ......

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