web-dev-qa-db-de.com

iOS: So verwenden Sie MPMoviePlayerController

Ich habe ein leeres Projekt (iOS) erstellt und dieses in mein viewDidLoad eingefügt:

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

Wenn die App gestartet wird, erhalte ich nur ein weißer Bildschirm mit Fehlermeldungen im Protokoll:

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

... und ein paar Zeilen zum Deaktivieren von Autoplay. Insbesondere verstehe ich die Zeile über die Ansicht, die nicht Teil der Hierarchie ist, nicht, da es sich um ein leeres iOS-Projekt "Single View Application" handelt und der Code in ViewController.m enthalten ist. Es ist IS in der Ansichtshierarchie.

Ich weiß, dass die Filmdatei selbst nicht das Problem ist, da ich sie aus Apples Beispielcode auf MPMoviePlayer erhalten habe. Und obwohl ich (anscheinend) alles ausprobiert habe, was in der Probe steht, konnte ich den Player einfach nicht zum Arbeiten bringen.

Hier ist ein weiterer Versuch, diesmal mit MPMoviePlayerController (nicht 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];

Ähnliches Ergebnis, mit weißem Bildschirm und Fehlern. Bitte helfen Sie ....

30
Zoltán Matók

Es stellt sich heraus, dass wir nur Folgendes tun müssen:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"];
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];
  • movieController ist eine Instanz von MPMoviePlayerViewController, die in der .h-Datei deklariert ist.

  • Wichtig: Verwenden Sie beim Definieren der URL die Methode URLWithString von NSURL, wenn Sie über ein Netzwerk auf die Datei zugreifen möchten, und die Methode fileUrlWithPath von NSURL, wenn Sie die Datei lokal haben!

  • [movieController.moviePlayer play]ist nicht erforderlich und der Player startet, unabhängig davon, ob Sie die automatische Wiedergabe auf NO eingestellt haben, aber ich habe festgestellt, dass es startet, wenn Sie play eingeben ein bisschen schneller. Dies könnte nur ein Zufall sein.

  • Wenn Sie wissen möchten, wenn der Benutzer auf die Schaltfläche "Fertig" geklickt hat (der Player wird automatisch geschlossen), sollten Sie wissen, dass -viewDidAppear Auf dem View Controller aufgerufen wird, der angezeigt wird, wenn der Player geschlossen wird . Sie können eine BOOL -Variable festlegen, wenn der Player startet, und in Ihrem -viewDidAppear Nach dem BOOL suchen, damit Sie wissen, dass -viewDidAppear Wegen der aufgerufen wurde Spieler wurde entlassen. Alternativ können Sie sich für die MPMoviePlayerDidExitFullScreen Benachrichtigung registrieren, aber das hat bei mir nicht funktioniert.

ODER, wenn dies nicht funktioniert, können Sie einfach Folgendes tun

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 ist eine Instanz von MPMoviePlayerController (nicht MPMoviePlayerViewController). Meiner Erfahrung nach ist es wichtig, es als Eigenschaft zu deklarieren (wie zum Beispiel: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;) und nicht als einfaches ivar, da es manchmal einfach nicht funktioniert, wenn es sich um ein ivar handelt

  • das Einstellen des Frames ist ebenfalls wichtig, da das Video überhaupt nicht angezeigt wird, wenn wir es nicht einstellen. Der Rahmen kann beliebig lang sein, solange sich das, was Sie definieren, innerhalb der Grenzen Ihrer Ansicht befindet

  • Wichtig: Verwenden Sie wie oben beim Definieren der URL die URLWithString -Methode von NSURL, wenn Sie auf die Datei zugreifen möchten über ein Netzwerk und verwenden Sie die fileUrlWithPath wenn du die datei hast lokal!

89
Zoltán Matók

Das musst du probieren ......

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

Versuche dies:

//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.
2
Rakesh Kumar

Versuchen Sie, hinzuzufügen

[player prepareToPlay];

nach

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

Weitere Informationen zu MPMoviePlayerController finden Sie in Apple Dokumentation: http://developer.Apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference. html # // Apple_ref/doc/c_ref/MPMoviePlayerController

1
Mikhail Viceman