Dieses Lernprogramm bietet eine schrittweise Übersicht über die Integration des MediaPlayer-Frameworks und die Arbeit mit der MPMoviePlayerController-Klasse in iOS4. Mit diesem Wissen können Sie Vollbildmedien in Ihren eigenen Anwendungen wiedergeben oder Videos als benutzerdefinierte Unteransicht in Ihren eigenen View-Controllern anzeigen. Lesen Sie weiter für mehr!
In diesem Lernprogramm wird eine einfache Anwendung namens "BigBuckBunny" verwendet, um die Verwendung des MediaPlayer-Frameworks und der Klasse MPMoviePlayerController für das iOS 4-SDK zu demonstrieren. Diese App gibt einen Beispielclip aus dem 2008 animierten Kurzfilm "Big Buck Bunny" aus. Wenn Sie das diesem Beitrag beigefügte Demo-Projekt herunterladen, können Sie alle Schritte in diesem Lernprogramm genau befolgen. Wenn Sie jedoch bereits über ein iPhone-Projekt verfügen, in dem Sie Ihre eigenen Filme abspielen möchten, sollten Sie dennoch in der Lage sein, Ihren eigenen Code mit nur geringfügigen Änderungen an diesen Schritten zu verfolgen. Der an diesen Beitrag angehängte Download enthält zwei Versionen des Projekts: BigBuckBunny-Start sollte verwendet werden, wenn Sie alle Schritte mit einbeziehen möchten, und BigBuckBunny-Fertig ist das Endergebnis dieses Tutorials.
STRG + Klicken (oder rechter Mausklick) auf den Ordner "Frameworks" im Bereich "Groups & Files" in Xcode. Wählen Hinzufügen> Vorhandene Frameworks aus dem Dropdown-Menü.
Wählen Sie "MediaPlayer.framework" aus der Liste der angezeigten Optionen aus und klicken Sie auf "Hinzufügen".
Nachdem Sie nun das Media Player-Framework in Ihr Projekt eingefügt haben, müssen Sie den Code in diesem Framework tatsächlich in den View-Controller importieren, der für die Wiedergabe des Films verantwortlich ist. Gehe zum BigBuckBunnyViewController.h
Datei und fügen Sie die folgende Codezeile unterhalb des UIKit ein #einführen
Linie:
#einführen#einführen
Diese Codezeile macht den View Controller auf alles aufmerksam, was der MediaPlayer.framework
hat anzubieten.
Als Nächstes müssen wir eine Instanzmethode unseres View-Controllers deklarieren, die die Filmwiedergabe auslöst. Direkt über dem @Ende
Anweisung in der Header-Datei, fügen Sie folgende Zeile hinzu:
-(IBAction) playMovie: (id) Absender;
Mit unserer Film abspielen
Nachdem die Methode deklariert wurde, können wir mit dem Schreiben des Implementierungscodes für den View Controller beginnen.
Öffne das BigBuckBunnyViewController.m
Datei. Implementieren Sie die playMovie-Methode mit den folgenden Codezeilen:
-(IBAction) playMovie: (id) sender NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL fileURLWithPath: Dateipfad]; MPMoviePlayerController * moviePlayerController = [[Zuweisung von MPMoviePlayerController] initWithContentURL: fileURL]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play];
In Zeile 3 erstellen wir einen NSString, der den Dateipfad zu unserer Filmdatei enthält. In Zeile 4 verwenden wir diesen Dateipfad, um eine NSURL für unseren lokalen Film zu erstellen. In Zeile 5 implementieren wir dies, indem wir die NSURL in die initWithContentURL:
Methode der MPMoviePlayerController
Objekt. Beachten Sie, wie wir dem Movie-Player in dieser Zeile Speicherplatz zugewiesen haben. wir werden das später veröffentlichen müssen! In Zeile 6 fügen wir die MPMoviePlayerController-Ansicht unserer benutzerdefinierten Ansichts-Controller-Unteransicht hinzu, sodass sie auf dem Bildschirm angezeigt wird. In Zeile 7 geben wir an, dass das Video im Vollbildmodus abgespielt werden soll, und in Zeile 8 beginnen wir mit der Wiedergabe des Films.
Bevor wir unseren Code testen können, müssen wir die Aktion "Touch Up Inside" unseres Buttons mit der playMovie-Methode verknüpfen. Öffnen Sie dazu BigBuckBunnyViewController.xib
im Interface Builder. STRG + Klicken Sie mit der rechten Maustaste auf den benutzerdefinierten UIButton in der Mitte des Bildschirms, um die Aktionen für dieses Element anzuzeigen. Ziehen Sie aus dem Kreis neben "Touch Up Inside" in das Objekt "File's Owner" und wählen Sie den angezeigten Text "playMovie:" aus. Speichern Sie Ihren Fortschritt im Interface Builder, bevor Sie wieder zu Xcode wechseln.
HINWEIS: Sie müssen playMovie auswählen, wenn es angezeigt wird, um diesen Schritt abzuschließen. Speichern Sie Ihre Änderungen unbedingt!
Wenn Sie das Projekt an diesem Punkt erstellen und debuggen, wird die Filmwiedergabe wie erwartet funktionieren, wenn Sie auf das benutzerdefinierte UIButton tippen. jedoch, Feiern Sie noch nicht, weil wir nicht ganz fertig sind.
Wie bereits erwähnt, weisen wir dem moviePlayerController-Objekt explizit Speicher zu, der jedoch noch nicht freigegeben wurde. Dies ist ein interessantes Szenario. Wir können das Objekt nicht explizit in der Methode freigeben, in der wir es zugewiesen haben, da unser Film zu dem Zeitpunkt noch abgespielt wird, zu dem diese Methode ausgeführt wird. Es ist auch nicht sicher, das Objekt automatisch freizugeben, da wir nicht wissen, ob unser Film bei der nächsten Erschöpfung des Autorelease-Pools noch läuft. Glücklicherweise ist das MPMoviePlayerController-Objekt für die Verarbeitung dieses Szenarios vorgefertigt und löst eine aufgerufene Benachrichtigung aus MPMoviePlayerPlaybackDidFinishNotification
an das NSNotificationCenter, wenn die Wiedergabe abgeschlossen ist. Um diese Benachrichtigung zu erhalten, müssen wir einen "Beobachter" registrieren, um auf diese spezielle Benachrichtigung zu antworten. Ändern Sie dazu unser Film abspielen
Methode wie folgt:
NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL fileURLWithPath: Dateipfad]; MPMoviePlayerController * moviePlayerController = [[Zuweisung von MPMoviePlayerController] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: Selbstauswahl: @selector (moviePlaybackComplete :) Name: MPMoviePlayerPlaybackDidFinishNotification-Objekt: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play];
Wir müssen jetzt schaffen moviePlaybackComplete:
, den Selektor haben wir gerade registriert. Fügen Sie das folgende unter dem hinzu Film abspielen
Methode:
- (void) moviePlaybackComplete: (NSNotification *) Benachrichtigung MPMoviePlayerController * moviePlayerController = [Benachrichtigungsobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: Eigenname: MPMoviePlayerPlaybackDidFinishNotification-Objekt: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController-Version];
Denken Sie an den "object" -Parameter, den wir eingestellt haben moviePlayerController
in dem Film abspielen
Methode oben? Welches Objekt Sie für diesen Wert festlegen, wird später zusammen mit der Benachrichtigung gesendet. In Zeile 3 rufen wir dieses Objekt mit der [Benachrichtigungsobjekt]
Anweisung und Referenzierung mit einem neuen Zeiger MPMoviePlayerController. Als nächstes senden wir in Zeile 4 erneut eine Nachricht an das NSNotificationCenter. Dieses Mal wird der von uns registrierte Beobachter entfernt Film abspielen
. In Zeile 8 bereinigen wir unseren benutzerdefinierten Ansichts-Controller, indem wir die moviePlayerController-Ansicht aus unserem Display entfernen, und in Zeile 9 geben wir den Speicher frei, den wir ursprünglich in dem zugewiesen haben Film abspielen
Methode.
Zu diesem Zeitpunkt sollte unsere Implementierungsdatei so aussehen:
#import "BigBuckBunnyViewController.h" @implementation BigBuckBunnyViewController - (IBAction) playMovie: (id) sender NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL fileURLWithPath: Dateipfad]; MPMoviePlayerController * moviePlayerController = [[Zuweisung von MPMoviePlayerController] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: Selbstauswahl: @selector (moviePlaybackComplete :) Name: MPMoviePlayerPlaybackDidFinishNotification-Objekt: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play]; - (void) moviePlaybackComplete: (NSNotification *) Benachrichtigung MPMoviePlayerController * moviePlayerController = [Benachrichtigungsobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: Eigenname: MPMoviePlayerPlaybackDidFinishNotification-Objekt: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController-Version]; - (void) Dealloc [Super Dealloc]; @Ende
Herzliche Glückwünsche! Sie sollten jetzt einen funktionierenden Filmplayer in Ihrer Anwendung haben. Der Rest dieses Tutorials ist der Anpassung des Players gewidmet.
Ihre Arbeit im vorherigen Schritt ermöglichte Ihnen die Wiedergabe von Filmen im Vollbildmodus. Der große Vorteil der MPMoviePlayerController-Verbesserungen in iOS 4 besteht jedoch darin, dass Sie jetzt eine benutzerdefinierte Anzeigegröße für die Wiedergabe in Ihren eigenen View-Controllern angeben können. Um dies zu nutzen, ändern Sie die playMovie-Methode wie folgt:
[moviePlayerController.view setFrame: CGRectMake (38, 100, 250, 163)]; [self.view addSubview: moviePlayerController.view]; //moviePlayerController.fullscreen = YES; [moviePlayerController play];
In Zeile 1 erstellen wir eine benutzerdefinierte Bildgröße für die Filmwiedergabe mit der CGRectMake
Funktion. Die von mir eingegebenen Werte wurden aus dem Interface Builder übernommen und stimmen mit Ursprung, Höhe und Breite des benutzerdefinierten UIButton überein, den wir zum Abspielen des Films verwenden. Beachten Sie, dass ich den Vollbildbefehl in Zeile 4 auskommentiert habe.
Wenn Sie jetzt Ihren Projektcode erstellen und mit Ihrem Projektcode fortfahren, sollten Sie nun sehen, dass durch Klicken auf die Schaltfläche das Video jetzt in unserem benutzerdefinierten Ansichts-Controller direkt über dem UIButton abgespielt wird. Das funktioniert gut genug, aber was ist, wenn Sie den Knopf etwas verschieben möchten, um den richtigen Look zu finden? Es ist etwas umständlich, ständig die wörtlichen CGRect-Werte zu kopieren. Aktualisieren Sie die playMovie-Methode, um dies dynamisch auszuführen:
-(IBAction) playMovie: (id) sender UIButton * playButton = (UIButton *) sender; NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL fileURLWithPath: Dateipfad]; MPMoviePlayerController * moviePlayerController = [[Zuweisung von MPMoviePlayerController] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: Selbstauswahl: @selector (moviePlaybackComplete :) Name: MPMoviePlayerPlaybackDidFinishNotification-Objekt: moviePlayerController]; [moviePlayerController.view setFrame: CGRectMake (playButton.frame.origin.x, playButton.frame.origin.y, playButton.frame.size.width, playButton.frame.size.height)]; [self.view addSubview: moviePlayerController.view]; //moviePlayerController.fullscreen = YES; [moviePlayerController play];
In Zeile 3 oben typisieren wir den Parameter "sender" in ein UIButton-Objekt, da wir wissen, dass dies die Art von Objekt ist, das diese Nachricht an unseren View-Controller sendet. Wir greifen dann direkt auf dieses Objekt zu, um den X- und Y-Ursprung der Schaltfläche sowie die Breite und Höhe der Schaltfläche zu ermitteln. Wenn der Code oben implementiert ist, können wir den UIButton frei auf der Leinwand verschieben und müssen uns nicht darum kümmern, unseren CGRectMake-Funktionsaufruf ständig zu aktualisieren.
Wenn Sie ein Video in einem benutzerdefinierten Rechteck anzeigen, müssen Sie das Video manchmal ändern scalingMode
Eigenschaft des MPMoviePlayerController-Objekts. Durch Festlegen dieser Eigenschaft wird festgelegt, wie sich das Filmbild an die von Ihnen definierte Wiedergabegröße anpasst. Die verfügbaren Einstellungen für den Skalierungsmodus lauten wie folgt:
Jede der oben genannten Optionen funktioniert wie erwartet mit MPMovieScalingModeAspectFill
und MPMovieScalingModeFill
wahrscheinlich die zwei am häufigsten verwendeten Modifikationen. Der Standard-Skalierungsmodus ist MPMovieScalingModeAspectFit
.
Um mit dieser Eigenschaft in unserem Code zu experimentieren, fügen Sie die folgende Zeile unmittelbar vor dem ein [moviePlayerController abspielen]
Aussage:
moviePlayerController.scalingMode = MPMovieScalingModeFill;
Sie werden sehen, dass unser Video jetzt den gesamten verfügbaren Platz im Wiedergabe-Rechteck ausfüllt.
In diesem Lernprogramm wurde eine grundlegende Einführung in die Verwendung der Klasse MPMoviePlayerController mit dem MediaPlayer-Framework gegeben. Die MPMoviePlayerController-Klasse hat zusätzliche Optionen, die wir hier nicht behandelt haben, aber ich lasse die Erkundung davon als Übung für den Leser. Mit der Grundlage dieses Tutorials sollten Sie in der Lage sein, auf eigene Faust zu experimentieren! Bitte hinterlassen Sie Feedback oder Fragen in den Kommentaren. Sie können auch gerne Fragen oder Kommentare über mein persönliches Twitter @ markhammonds oder den offiziellen Mobiletuts + Twitter-Account @mobtuts senden. Vielen Dank für das Lesen und viel Glück bei Ihren eigenen Projekten!