Denna handledning är en stegvis överblick över hur man integrerar MediaPlayer-ramen och arbetar med klassen MPMoviePlayerController i iOS4. Med den här kunskapen kan du spela upp fullskärmsmedia i dina egna applikationer eller visa videor som en underordnad anpassad storlek i dina egna kontroller. Läs vidare för mer!
Denna handledning kommer att använda en enkel applikation som heter "BigBuckBunny" för att demonstrera med hjälp av MediaPlayer-ramen och MPMoviePlayerController-klassen för iOS 4 SDK. Den här appen spelar ett provklipp från 2008, den animerade kortfilmen Big Buck Bunny med kreativ kommons. Genom att ladda ner det demoprojekt som bifogas det här inlägget kommer du att kunna exakt följa alla steg i denna handledning. Men om du redan har ett iPhone-projekt som du vill spela egna filmer inom, borde du fortfarande kunna följa med i din egen kod med endast små ändringar av dessa steg. Nedladdningen som bifogas detta inlägg innehåller två versioner av projektet: BigBuckBunny-Start bör användas om du vill integrera alla steg som du går och, och BigBuckBunny-Genomförd är slutresultatet av denna handledning.
CTRL + Klicka (eller högerklicka) på "Ramar" -mappen i rutan "Grupper och filer" i Xcode. Välj Lägg till> Befintliga ramar från rullgardinsmenyn.
Välj "MediaPlayer.framework" från listan över presenterade alternativ och klicka på "Lägg till".
Nu när du har lagt till mediespelarramen i ditt projekt måste du faktiskt importera koden i den ramen till visningscontrollern som ansvarar för att spela filmen. Gå till BigBuckBunnyViewController.h
fil och sätt i följande kod under UIKit #importera
linje:
#importera#importera
Denna kodlinje kommer att göra vykontrollanten medveten om allt som MediaPlayer.framework
har att erbjuda.
Därefter måste vi förklara en instansmetod för vår visningskontroller som utlöser filmuppspelning. Precis ovanför @slutet
uttalande i headerfilen, lägg till den här raden:
-(IBAction) playMovie: (id) avsändare;
Med vår spela film
metod som deklarerats, är vi beredda att börja skriva vår kontrollkontrollens implementeringskod.
Öppna BigBuckBunnyViewController.m
fil. Implementera playMovie-metoden med följande rader av kod:
-(IBAction) playMovie: (id) avsändare NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL filURLWithPath: filepath]; MPMoviePlayerController * moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play];
På rad 3 skapar vi en NSString som innehåller filvägen till vår filmfil. På rad 4 använder vi den filvägen för att skapa en NSURL till vår lokala film. På linje 5 genomför vi detta genom att överföra NSURL till initWithContentURL:
metod för MPMoviePlayerController
objekt. Lägg märke till hur vi tilldelade minne för filmspelaren på den här raden; vi måste släppa det senare! På linje 6 lägger vi till MPMoviePlayerController-vyn i vår undervyn för anpassad visningskontroll så att den kommer att visas på skärmen. På rad 7 anger vi att vi vill att videon ska spelas i helskärmsläge och på rad 8 börjar vi uppspelning av filmen.
Innan vi kan testa vår kod måste vi länka vår knapps "Touch Up Inside" -åtgärd med playMovie-metoden. För att göra detta, öppna BigBuckBunnyViewController.xib
i gränssnittsbyggare. CTRL + Klicka (eller högerklicka) på den anpassade UIButton i mitten av skärmen för att visa åtgärderna för det här elementet. Dra från cirkeln bredvid "Touch Up Inside" till "File Owner" -objektet och välj sedan texten "playMovie:" som visas. Spara dina framsteg i gränssnittsbyggare innan du växlar tillbaka till Xcode.
OBS! Du måste faktiskt välja playMovie när det verkar som att slutföra det här steget. Var noga med att spara dina ändringar!
Om du bygger och felsöker projektet vid den här tiden ser du att filmuppspelningen fungerar som förväntat när du trycker på den anpassade UI-knappen. dock, Fira inte ännu, för vi är inte helt färdiga.
Som tidigare nämnts, tilldelar vi explicit minne för filmen MovieControllerController, men vi har ännu inte släppt det minnet. Detta är ett intressant scenario. Vi kan inte uttryckligen släppa objektet i metoden vi tilldelade det eftersom vår film fortfarande spelas när den här metoden fullbordar utförandet. Det är också inte säkert att autoreleera objektet eftersom vi inte vet om vår film fortfarande spelas nästa gång autorelease-poolen dräneras. Lyckligtvis är MPMoviePlayerController-objektet förberett för att hantera detta scenario och skickar en anmälan som heter MPMoviePlayerPlaybackDidFinishNotification
till NSNotificationCenter när uppspelningen är klar. För att kunna få denna anmälan måste vi registrera en "observatör" för att svara på den specifika anmälan. För att göra det, ändra vårt spela film
metod enligt följande:
NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL filURLWithPath: filepath]; MPMoviePlayerController * moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (moviePlaybackComplete :) namn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play];
Vi behöver nu skapa moviePlaybackComplete:
, väljaren vi just registrerat. Lägg till följande under spela film
metod:
- (void) moviePlaybackComplete: (NSNotification *) notification MPMoviePlayerController * moviePlayerController = [meddelandeobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: namn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController release];
Kom ihåg parameteren "objekt" som vi satt till moviePlayerController
i spela film
metod ovan? Vilket objekt du ställt in för det värdet skickas tillsammans med meddelandet senare. På rad 3 hämtar vi det objektet med [anmälningsobjekt]
uttalande och hänvisa det till en ny MPMoviePlayerController-pekare. Sedan, på rad 4 skickar vi igen ett meddelande till NSNotificationCenter, den här gången tar vi bort observatören vi registrerade spela film
. På linje 8 städar vi upp vår anpassade bildkontroll genom att ta bort moviePlayerController-vy från vår bildskärm och på rad 9 slutar vi ut genom att släppa det minne som vi ursprungligen tilldelade i spela film
metod.
Vid denna tidpunkt bör vår implementeringsfil se ut så här:
#import "BigBuckBunnyViewController.h" @implementation BigBuckBunnyViewController - (IBAction) playMovie: (id) avsändare NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL filURLWithPath: filepath]; MPMoviePlayerController * moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (moviePlaybackComplete :) namn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play]; - (void) moviePlaybackComplete: (NSNotification *) notification MPMoviePlayerController * moviePlayerController = [meddelandeobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: namn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController release]; - (void) dealloc [super dealloc]; @slutet
grattis! Du borde nu ha en fungerande filmspelare i din ansökan. Resten av denna handledning är avsedd för anpassning av spelaren.
Med ditt arbete i föregående steg kan du spela filmer i helskärmsläge. Den stora delen om förbättringarna i MPMoviePlayerController i iOS 4 är dock att du nu kan ange en anpassad skärmstorlek för uppspelning i dina egna kontroller. För att dra nytta av detta, ändra playMovie-metoden enligt följande:
[moviePlayerController.view setFrame: CGRectMake (38, 100, 250, 163)]; [self.view addSubview: moviePlayerController.view]; //moviePlayerController.fullscreen = YES; [moviePlayerController play];
På linje 1 skapar vi en anpassad ramstorlek för filmuppspelning med CGRectMake
fungera. Värdena jag har angett togs från Interface Builder och matchar ursprung, höjd och bredd av den anpassade UIButton som vi använder för att spela filmen. Observera att jag också kommenterade kommandot fullskärm på rad 4.
Om du bygger och går med din projektkod nu borde du se att att klicka på knappen nu spelar videon i vår anpassade bildkontroll, precis ovanför UIButton. Det fungerar bra nog, men vad händer om du vill flytta knappen runt lite för att hitta rätt utseende? Det är lite besvärligt att ständigt kopiera de bokstavliga CGRect-värdena hela tiden. Uppdatera playMovie-metoden för att göra detta dynamiskt:
-(IBAction) playMovie: (id) avsändare UIButton * playButton = (UIButton *) avsändare; NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "big-buck-bunny-clip" ofType: @ "m4v"]; NSURL * fileURL = [NSURL filURLWithPath: filepath]; MPMoviePlayerController * moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (moviePlaybackComplete :) namn: MPMoviePlayerPlaybackDidFinishNotification object: 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];
På rad 3 ovan, vi typecast parametern "avsändare" till ett UIButton-objekt eftersom vi vet att det är den typ av objekt som kommer att skicka detta meddelande till vår vyskontroller. Vi får sedan tillgång till det här objektet direkt för att få knappens X- och Y-ursprung samt knappens bredd och höjd. Med koden ovan implementeras kan vi flytta UIButton någonstans på duken och behöver inte oroa oss för att ständigt uppdatera vårt CGRectMake-funktionssamtal.
När du visar video i en anpassad rektangel, behöver du ibland modifiera scalingMode
egenskapen för MPMoviePlayerController-objektet. Om du ställer in den här egenskapen bestäms hur filmbilden anpassas för att fylla uppspelningsstorleken du har definierat. De tillgängliga inställningarna för skalvläge är som följer:
Var och en av ovanstående alternativ fungerar som du kan förvänta dig med MPMovieScalingModeAspectFill
och MPMovieScalingModeFill
sannolikt de två mest använda ändringarna. Standardskalningsläget är MPMovieScalingModeAspectFit
.
För att experimentera med den här egenskapen i vår kod lägger du in följande rad strax före [moviePlayerController play]
påstående:
moviePlayerController.scalingMode = MPMovieScalingModeFill;
Du ser att vår video nu fyller allt tillgängligt utrymme i uppspelningsrektangeln.
Denna handledning har presenterat en grundläggande introduktion till att använda MPMoviePlayerController-klassen med MediaPlayer-ramen. MPMoviePlayerController-klassen har ytterligare alternativ som vi inte har täckt här, men jag lämnar utforskningen av dem som en övning för läsaren. Med grunden från denna handledning på plats, bör du kunna börja experimentera på egen hand! Vänligen lämna någon återkoppling eller frågor som du kan ha i kommentarfältet nedan. Också gärna skicka in frågor eller kommentarer via antingen min personliga twitter @ markhammonds eller det officiella Mobiletuts + twitter-kontot @mobtuts. Tack för att du läste, och lycka till på dina egna projekt!