2010-12-06 19 views
23

Ich versuche, zwei MPMoviePlayerController auf einem UIView zu setzen wie dieseMehrere MPMoviePlayerController Instanzen

for (int i = 0; i < 2; i++) 
{ 
    UIView* v = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 300.0f * i, self.view.width, 300.0f)]; 
    [self.view addSubview: v]; 

    NSURL* url = [NSURL URLWithString: [urls objectAtIndex: i]]; 
    MPMoviePlayerController* movieController = [[MPMoviePlayerController alloc] initWithContentURL: url]; 
    movieController.movieSourceType = MPMovieSourceTypeFile; 
    movieController.shouldAutoplay = NO; 
    movieController.view.frame = v.bounds; 
    [self.view addSubview: movieController.view]; 
} 

Aber nur eine Ansicht zu einem Zeitpunkt gezeigt. Ich weiß, dass die Dokumentation von Apple sagt

Hinweis: Obwohl Sie mehrere MPMoviePlayerController-Objekte erstellen können und ihre Ansichten in Ihrer Benutzeroberfläche präsentieren, kann nur jeweils ein Film-Player seinen Film abspielen.

aber sollte nicht die Ansicht alle zwei Spieler gleichzeitig zeigen? Auch nur eine Instanz sendet MPMoviePlayerLoadStateDidChangeNotification Benachrichtigungen ...

+0

Haben Sie eine Antwort darauf gefunden? – Pompair

+0

Nein. Wurde gezwungen, ein UIWebView mit eingebetteten Videos zu verwenden. –

Antwort

0

Müssen Sie beide Videos gleichzeitig wiedergeben?

Ich denke, ich habe zwei Möglichkeiten:

  1. Fügen Sie zwei Video-Miniaturansicht Tasten auf dem gleichen Bildschirm. Je nach Auswahl wird das ausgewählte Video abgespielt und andere werden gestoppt. Zu einem bestimmten Zeitpunkt wird also nur ein einzelnes Video abgespielt.

  2. Erstellen Sie einen separaten View-Controller und fügen Sie Ihr Video hinzu. Fügen Sie nun viewcontroller.view in Ihrer Hauptansicht hinzu, wo immer Sie möchten.

Lassen Sie mich wissen, ob diese für Sie arbeiten.

1

Sie können dies nicht tun. Intern scheint MPMoviePlayerController die gleiche Ansicht für den Handel zwischen Instanzen zu verwenden, abhängig davon, welche Instanz gerade abgespielt wird. Ihre einzige Möglichkeit besteht darin, Ihren eigenen Videoplayer mit AVFoundation zu entwickeln, um mehrere Instanzen zu erhalten, oder HTML und UIWebViews zu verwenden. Siehe: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010188

+0

Es ist einfach kaputt: Wenn Sie zwei MPMoviePlayerViewController auf dem gleichen Bildschirm aufrufen, werden beide einfach schwarz und nichts funktioniert! (Dez 2013.) – Fattie

+2

Eigentlich spielt das zuletzt hinzugefügte Video, aber die anderen zeigen nur ihre Hintergrundfarben. – erkanyildiz

27

Sie können mithilfe des AVFoundation Rahmen mehrere Videos auf dem Bildschirm spielen: AV Foundation Programming Guide

Der Nachteil ist, dass es nicht so einfach zu bedienen wie die MPMoviePlayerController ist, und Sie shoul eine UIView Unterklasse schaffen, enthält die AVFoundation-Klassen. Auf diese Weise können Sie die erforderlichen Steuerelemente dafür erstellen, die Videowiedergabe steuern und die Ansicht animieren (z. B. den Übergang zum Vollbild animieren).

Hier ist es, wie ich es verwendet:

// Create an AVURLAsset with an NSURL containing the path to the video 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; 

// Create an AVPlayerItem using the asset 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

// Create the AVPlayer using the playeritem 
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 

// Create an AVPlayerLayer using the player 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 

// Add it to your view's sublayers 
[self.layer addSublayer:playerLayer]; 

// You can play/pause using the AVPlayer object 
[player play]; 
[player pause]; 

// You can seek to a specified time 
[player seekToTime:kCMTimeZero]; 

// It is also useful to use the AVPlayerItem's notifications and Key-Value 
// Observing on the AVPlayer's status and the AVPlayerLayer's readForDisplay property 
// (to know when the video is ready to be played, if for example you want to cover the 
// black rectangle with an image until the video is ready to be played) 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[player currentItem]]; 

    [player addObserver:self forKeyPath:@"currentItem.status" 
        options:0 
        context:nil]; 

    [playerLayer addObserver:self forKeyPath:@"readyForDisplay" 
        options:0 
        context:nil]; 

Sie können die AVPlayerLayer Größe ändern, wie Sie möchten, auch während das Video abgespielt wird.

Wenn Sie Animationen bei der Größenanpassung oder Neupositionierung Ihres AVPlayerLayers verwenden möchten, müssen Sie die Standardanimationen ändern. Andernfalls sehen Sie, dass das Video des Player-Layers nicht synchron mit seinem Rect skaliert wird. (Danke an @djromero für seine answer regarding the AVPlayerLayer animation)

Hier ist ein kleines Beispiel, wie man seine Standardanimation ändert. In diesem Beispiel befindet sich der AVPlayerLayer in einer UIView-Unterklasse, die als sein Container fungiert:

// UIView animation to animate the view 
[UIView animateWithDuration:0.5 animations:^(){ 
    // CATransaction to alter the AVPlayerLayer's animation 
    [CATransaction begin]; 
    // Set the CATransaction's duration to the value used for the UIView animation 
    [CATransaction setValue:[NSNumber numberWithFloat:0.5] 
        forKey:kCATransactionAnimationDuration]; 
    // Set the CATransaction's timing function to linear (which corresponds to the 
    // default animation curve for the UIView: UIViewAnimationCurveLinear) 
    [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction 
          functionWithName:kCAMediaTimingFunctionLinear]]; 

     self.frame = CGRectMake(50.0, 50.0, 200.0, 100.0); 
     playerLayer.frame = CGRectMake(0.0, 0.0, 200.0, 100.0); 

    [CATransaction commit]; 

}]; 
+1

Unglaubliche Antwort .... danke – Fattie

+0

@Alpar - Dies funktioniert als Charme, aber eine Frage. Warum wird beim Hinzufügen von observer AVPlayerItemDidPlayToEndTimeNotification das Objekt als [player currentItem] angegeben? Was, wenn ich nur Spieler sage? Wenn ich den Player anwähle, wird die Benachrichtigung für alle Video-Instanzen gesendet. –

+0

Vielen Dank, arbeitete wie ein Charme –