Denne veiledningen er en trinnvis oversikt over hvordan du integrerer MediaPlayer-rammen og jobber med MPMoviePlayerController-klassen i iOS4. Med denne kunnskapen kan du spille av fullskjermmedier i dine egne applikasjoner eller vise videoer som et tilpasset størrelse undervisning i dine egne visningskontrollere. Les videre for mer!
Denne opplæringen vil bruke et enkelt program kalt "BigBuckBunny" for å demonstrere bruk av MediaPlayer-rammen og MPMoviePlayerController-klassen for iOS 4 SDK. Denne appen vil spille et eksempelklipp fra 2008, kreativ-commons animerte kortfilm Big Buck Bunny. Ved å laste ned demo-prosjektet som er vedlagt dette innlegget, vil du kunne følge alle trinnene i denne opplæringen nøyaktig. Men hvis du allerede har et iPhone-prosjekt som du vil spille av egne filmer på, bør du fortsatt kunne følge med i din egen kode med bare små endringer i disse trinnene. Nedlastingen som er vedlagt dette innlegget inneholder to versjoner av prosjektet: BigBuckBunny-Start bør brukes hvis du vil integrere alle trinnene mens du går sammen, og BigBuckBunny-Fullført er sluttresultatet av denne opplæringen.
CTRL + Klikk (eller høyreklikk) på "Rammer" -mappen i ruten "Grupper og filer" i Xcode. Å velge Legg til> Eksisterende rammer fra rullegardinmenyen.
Velg "MediaPlayer.framework" fra listen over alternativer presentert, og klikk "Add."
Nå som du har lagt til mediespillerenes rammeverk i prosjektet ditt, må du faktisk importere koden i det rammene i visningscontrolleren som vil være ansvarlig for å spille av filmen. Gå til BigBuckBunnyViewController.h
fil, og sett inn følgende linje kode under UIKit #importere
linje:
#importere#importere
Denne linjen med kode vil gjøre visningsansvarlig oppmerksom på alt som MediaPlayer.framework
har å tilby.
Deretter må vi erklære en instansmetode for vår visningskontroller som vil utløse filmavspilling. Like over @slutt
setning i headerfilen, legg til denne linjen:
-(IBAction) playMovie: (id) sender;
Med vår spill film
Metode erklært, vi er klare til å begynne å skrive vår visningskontroller implementeringskode.
Åpne BigBuckBunnyViewController.m
fil. Implementer playMovie-metoden med følgende kodelinjer:
-(IBAction) playMovie: (id) avsender 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å linje 3 lager vi en NSString som inneholder filbanen til filmfilen vår. På linje 4 bruker vi den filbanen for å lage en NSURL til vår lokale film. På linje 5 implementerer vi dette ved å sende NSURL inn i initWithContentURL:
metode av MPMoviePlayerController
gjenstand. Legg merke til hvordan vi har tildelt minne for filmspilleren på denne linjen; vi må frigjøre det senere! På linje 6 legger vi til MPMoviePlayerController-visningen i undervisningen for tilpasset visningskontroll, slik at det vil vises på skjermen. På linje 7 angir vi at videoen skal spilles i fullskjermmodus, og på linje 8 begynner vi å spille av filmen.
Før vi kan teste vår kode, må vi knytte knappens "Touch Up Inside" -aksjon med playMovie-metoden. For å gjøre dette, åpne BigBuckBunnyViewController.xib
i grensesnittbygger. CTRL + Klikk (eller høyreklikk) på den egendefinerte UIButton i midten av skjermen for å vise handlingene for dette elementet. Dra fra sirkelen ved siden av "Touch Up Inside" til "File Owner" -objektet, og velg deretter "playMovie:" -teksten som vises. Lagre fremgangen i Interface Builder før du bytter tilbake til Xcode.
MERK: Du må faktisk velge playMovie når det ser ut til å fullføre dette trinnet. Husk å lagre endringene dine!
Hvis du bygger og feilsøker prosjektet på dette punktet, ser du at filmavspilling fungerer som forventet når du trykker på den tilpassede UIButton. derimot, Ikke feire enda, for vi er ikke helt ferdige.
Som nevnt tidligere tildeler vi eksplisitt minne for filmenPlayerController-objektet, men vi har ennå ikke gitt ut det minnet. Dette er et interessant scenario. Vi kan ikke eksplisitt frigjøre objektet i metoden vi tildelte det fordi vår film fortsatt vil spilles på den tiden denne metoden fullfører kjøring. Det er heller ikke trygt å autorelease objektet fordi vi ikke vet om filmen vår fortsatt vil spille neste gang autorelease-bassenget er drenert. Heldigvis er MPMoviePlayerController-objektet prebuilt for å håndtere dette scenariet, og vil sende et varsel kalt MPMoviePlayerPlaybackDidFinishNotification
til NSNotificationCenter når avspillingen fullføres. For å motta dette varselet må vi registrere en "observatør" for å svare på det aktuelle varselet. For å gjøre det, må du endre vår spill film
metode som følger:
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: selvvelger: @selector (moviePlaybackComplete :) navn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play];
Vi må nå opprette moviePlaybackComplete:
, selgeren vi nettopp registrert. Legg til følgende under spill film
metode:
- (void) moviePlaybackComplete: (NSNotification *) varsel MPMoviePlayerController * moviePlayerController = [varselobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: navn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController release];
Husk parameteren "objekt" som vi satte til moviePlayerController
i spill film
metode ovenfor? Uansett hvilket objekt du angir for verdien, sendes sammen med varselet senere. På linje 3 henter vi det objektet med [varselobjekt]
setning og referanse den med en ny MPMoviePlayerController pekeren. Neste, på linje 4, sender vi igjen en melding til NSNotificationCenter, denne gangen fjerner vi observatøren vi registrerte spill film
. På linje 8 rydder vi opp tilpasset visningskontrollen ved å fjerne moviePlayerController-visningen fra skjermen, og på linje 9 slutter vi ved å frigjøre minnet vi opprinnelig tildelte i spill film
metode.
På dette tidspunktet bør implementeringsfilen se slik ut:
#import "BigBuckBunnyViewController.h" @implementation BigBuckBunnyViewController - (IBAction) playMovie: (id) sender 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: selvvelger: @selector (moviePlaybackComplete :) navn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = YES; [moviePlayerController play]; - (void) moviePlaybackComplete: (NSNotification *) varsel MPMoviePlayerController * moviePlayerController = [varselobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: navn: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [moviePlayerController release]; - (void) dealloc [super dealloc]; @slutt
Gratulerer! Du bør nå ha en fungerende filmspiller i din søknad. Resten av denne opplæringen er dedikert til tilpasning av spilleren.
Ditt arbeid i forrige trinn gjorde at du kunne spille av filmer i fullskjermmodus. Den store delen om MPMoviePlayerController-forbedringene i iOS 4 er imidlertid at du nå kan angi en egendefinert skjermstørrelse for avspilling i dine egne visningskontrollere. For å dra nytte av dette, endrer du spillemovie-metoden som følger:
[moviePlayerController.view setFrame: CGRectMake (38, 100, 250, 163)]; [self.view addSubview: moviePlayerController.view]; //moviePlayerController.fullscreen = YES; [moviePlayerController play];
På linje 1 lager vi en tilpasset rammestørrelse for filmavspillingen med CGRectMake
funksjon. Verdiene jeg har angitt ble tatt fra Interface Builder og samsvarer med opprinnelsen, høyden og bredden til den tilpassede UIButton vi bruker til å spille av filmen. Merk at jeg også kommenterte fullskjerm kommandoen på linje 4.
Hvis du bygger og går med prosjektkoden din nå, bør du se at å klikke på knappen vil nå spille videoen i vår tilpassede visningskontroller, rett oppå UIButton. Dette fungerer godt nok, men hva hvis du vil flytte knappen litt rundt for å finne det rette utseendet? Det er litt tungvint å hele tiden kopiere de bokstavelige CGRect-verdiene. Oppdater playMovie-metoden for å gjøre dette dynamisk:
-(IBAction) playMovie: (id) avsender UIButton * playButton = (UIButton *) avsender; 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: selvvelger: @selector (moviePlaybackComplete :) navn: 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å linje 3 ovenfor, skriver vi inn «avsender» -parameteren til et UIButton-objekt som vi vet at det er den typen objekt som vil sende denne meldingen til vår visningskontroller. Vi får tilgang til dette objektet direkte for å få knappens X- og Y-opprinnelse, samt knappens bredde og høyde. Med koden ovenfor implementert, er vi fri til å flytte UIButton hvor som helst på lerretet og ikke trenger å bekymre deg for å kontinuerlig oppdatere vår CGRectMake-funksjonssamtale.
Når du viser video i et egendefinert rektangel, trenger du noen ganger å endre scalingMode
egenskapen til MPMoviePlayerController-objektet. Innstilling av denne egenskapen bestemmer hvordan filmen tilpasses for å fylle avspillingsstørrelsen du har definert. De tilgjengelige skaleringsmodusinnstillingene er som følger:
Hvert av alternativene ovenfor fungerer som du kanskje forventer, med MPMovieScalingModeAspectFill
og MPMovieScalingModeFill
sannsynligvis de to mest brukte modifikasjonene. Standard skaleringsmodus er MPMovieScalingModeAspectFit
.
For å eksperimentere med denne egenskapen i vår kode, sett inn følgende linje like før [moviePlayerController play]
uttalelse:
moviePlayerController.scalingMode = MPMovieScalingModeFill;
Du vil se at videoen vår nå fyller all ledig plass i avspillingsrektangel.
Denne opplæringen har presentert en grunnleggende introduksjon til bruk av MPMoviePlayerController-klassen med MediaPlayer-rammeverket. MPMoviePlayerController-klassen har flere alternativer som vi ikke har dekket her, men jeg vil etterlate utforskningen av dem som en øvelse for leseren. Med grunnlaget fra denne opplæringen på plass, bør du kunne begynne å eksperimentere på egen hånd! Vennligst gi tilbakemelding eller spørsmål du måtte ha i kommentarfeltet nedenfor. Du er også velkommen til å sende inn spørsmål eller kommentarer via enten min personlige twitter @ markhammonds eller den offisielle Mobiletuts + twitter-kontoen @mobtuts. Takk for at du leser, og lykke til på dine egne prosjekter!