2012-10-10 2 views
30

Ho creato un progetto vuoto (iOS) e mettere questo nel mio viewDidLoad:iOS: Come utilizzare MPMoviePlayerController

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

Quando l'applicazione si avvia tutto quello che ottiene è una schermata bianca con messaggi di errore nel 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! 

... e un gruppo di linee per quanto riguarda la disattivazione automatica. In particolare, non capisco la linea sulla vista che non fa parte della gerarchia poiché è un progetto iOS "Single View Application" vuoto e il codice è in ViewController.m. È nella gerarchia della vista.

So per certo che il file filmato non è il problema perché l'ho preso dal codice di esempio di Apple su MPMoviePlayer. E sebbene io (apparentemente) abbia provato tutto ciò che è stato scritto nel campione, non sono riuscito a far funzionare il giocatore.

Ecco un altro tentativo, questa volta con MPMoviePlayerController (non 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]; 

risultato simile, con schermo bianco e gli errori. Please help ....

+0

provare a mettere in 'viewDidAppear'. –

+0

Inserirlo in viewDidAppear risolto gli errori di contesto, grazie, ma non riesco ancora a ottenere il lettore, solo una schermata bianca –

risposta

89

venuto fuori tutto quello che dobbiamo fare è questo:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"]; 
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]; 
[self presentMoviePlayerViewControllerAnimated:movieController]; 
[movieController.moviePlayer play]; 
  • movieController è un'istanza di MPMoviePlayerViewController dichiarato nel file h.

  • Importante: quando si definisce l'URL utilizzare il metodo di NSURL URLWithString se si desidera accedere al file attraverso una rete e l'uso di fileUrlWithPath se avete il file localmente NSURL!

  • [movieController.moviePlayer play]non è richiesta e il giocatore inizierà a prescindere se non è stata impostata su NO autoplay, ma ho notato che se si mette play in esso inizia un po 'più veloce. Questa potrebbe essere solo una coincidenza.

  • Se volete sapere quando l'utente sfruttato il fatto tasto (il giocatore verrà licenziato automaticamente) si deve sapere che si chiama -viewDidAppear sul controller della vista che appare quando il giocatore è respinto. È possibile impostare una variabile BOOL all'avvio del lettore e verificare lo BOOL nel proprio -viewDidAppear in modo che si sappia che -viewDidAppear è stato chiamato perché il giocatore è stato licenziato. In alternativa è possibile registrarsi per la notifica MPMoviePlayerDidExitFullScreen, ma questo non ha funzionato per me.

O, se questo non funziona si può semplicemente effettuare le seguenti operazioni

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 è un'istanza di MPMoviePlayerController (non MPMoviePlayerViewController). Nella mia esperienza è importante dichiararlo come una proprietà (come ad esempio: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;) piuttosto che un semplice ivar, perché a volte non funziona se si tratta di un ivar

  • impostare il frame è anche importante, perché se noi non impostarlo, il video non apparirà affatto. Il telaio può essere qualsiasi cosa, a patto che ciò che si definisce è entro i limiti della vostra vista

  • importanti: Come sopra, al momento di definire l'URL utilizzare il metodo di NSURL URLWithString se si desidera accedere al file attraverso una rete e usa NSURL fileUrlWithPath se hai il file localmente!

+0

Ho provato questo codice e vedo solo il video quando lo aggiungo al sottomenu in questo modo: [self.view addSubview: _movieController.view]; Ma per qualche ragione, la scrubber superiore è di alcuni pixel più in basso rispetto al solito dalla barra di stato. C'è un modo per rettificare questo? E ottengo questi errori come mostrato in questa domanda. http://stackoverflow.com/questions/12822420/ios-how-to-use-mpmovieplayercontroller Cosa sto facendo male? – vnchopra

1

Prova aggiungere

[player prepareToPlay]; 

dopo

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

Si può leggere di più su MPMoviePlayerController nella documentazione di Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

+3

Questo dovrebbe essere un commento, non una risposta. Dai documenti che hai appena collegato ma che ovviamente non hai letto: "Se un lettore di film non è già pronto per suonare quando chiami il metodo di riproduzione, quel metodo chiama automaticamente questo metodo". Quindi questo non può essere il problema. Il problema è che l'attuale contesto CoreGraphics è 'NULL' nel momento in cui OP tenta di avviare la riproduzione. –

+0

Anche con l'esempio nei documenti che hai postato (nella parte Panoramica in alto ci sono alcune righe di codice che credo sia il codice minimo per farlo funzionare) non funziona. –

1

Prova questo:

//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 che cosa è movieArray? – KennyVB

8

Dovete provare questo ......

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