Redarea videoclipurilor pe iOS4 cu MediaPlayer Framework

Acest tutorial este o trecere în revistă pas cu pas a modului de integrare a cadrului MediaPlayer și de a lucra cu clasa MPMoviePlayerController în iOS4. Cu aceste cunoștințe, veți putea să redați materiale media pe ecran complet în propriile aplicații sau să afișați videoclipuri ca subdiviziuni de dimensiuni personalizate în propriile controlere de vizualizare. Citiți mai departe!

Setarea și prezentarea proiectului

Acest tutorial va folosi o aplicație simplă numită "BigBuckBunny" pentru a demonstra utilizarea cadrului MediaPlayer și a clasei MPMoviePlayerController pentru iOS 4 SDK. Această aplicație va juca un clip de proiecție din filmul de animație creativ-commons animat 2008, Big Buck Bunny. Prin descărcarea proiectului demo atașat la această postare, veți putea urmări cu precizie toți pașii din acest tutorial. Cu toate acestea, dacă aveți deja un proiect pe iPhone pe care doriți să-l jucați propriile filme, ar trebui să aveți în continuare posibilitatea de a vă urma în propriul cod, cu doar mici modificări la acești pași. Descărcarea atașată acestui articol conține două versiuni ale proiectului: BigBuckBunny-Start ar trebui să fie utilizat dacă doriți să integrați toți pașii pe măsură ce mergeți și BigBuckBunny-Finalizat este rezultatul final al acestui tutorial.

Pasul 1: Importați MediaPlayer Framework

CTRL + Faceți clic (sau clic-dreapta) în directorul "Cadre" din panoul "Grupuri și fișiere" din Xcode. Selectați Adăugați> Cadrele existente din meniul drop-down.

Selectați "MediaPlayer.framework" din lista opțiunilor prezentate și faceți clic pe "Adăugați".

Pasul 2: Importați MediaPlayer Framework și declarați metoda playMovie

Acum că ați adăugat cadrul media player în proiectul dvs., trebuie să importați de fapt codul în acest cadru în controlerul de vizualizare care va fi responsabil pentru redarea filmului. Mergeți la BigBuckBunnyViewController.h fișier și introduceți următoarea linie de cod sub UIKit #import linia:

 #import  #import  

Această linie de cod va face controlerul de vizualizare conștient de toate acestea MediaPlayer.framework trebuie sa ofere.

Apoi, trebuie să declarăm o metodă de instanță a controlerului nostru de vizualizare care va declanșa redarea filmului. Chiar deasupra @Sfârșit în fișierul antet, adăugați această linie:

 -(IBAction) playMovie: (id) expeditor; 

Cu a noastră dai drumu la film metoda declarată, suntem gata să începem să scriem codul de implementare a regulatorului de vizualizare.

Pasul 3: Implementați metoda playMovie

Deschide BigBuckBunnyViewController.m fişier. Implementați metoda playMovie cu următoarele rânduri de cod:

 -(IBAction) playMovie: (id) expeditor NSString * filepath = [[NSBundle mainBundle] caleForResource: @ "big-buck-bunny-clip" din Tip: @ "m4v"]; NSURL * fileURL = [NSURL fișierURLWithPath: filepath]; MPMoviePlayerController * filmPlayerController = [[MPMoviePlayerController alocare] initWithContentURL: fileURL]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = DA; [playPlayerController play];  

Pe linia 3, creăm un NSString care conține calea fișierului pentru fișierul nostru de film. Pe linia 4, folosim acea cale de fișier pentru a crea un NSURL la filmul nostru local. Pe linia 5 implementăm acest lucru trecând NSURL în initWithContentURL: metodă a MPMoviePlayerController obiect. Observați cum am alocat memoria pentru playerul de film pe această linie; va trebui să eliberăm asta mai târziu! Pe linia 6, adăugăm vizualizarea MPMoviePlayerController la subview-ul nostru de vizualizare personalizat, astfel încât acesta să apară pe ecran, pe linia 7 specificăm că dorim ca videoclipul să fie redat în modul ecran complet, iar în linia 8 începe redarea filmului.

Înainte de a ne putea testa codul, trebuie să conectăm acțiunea "Touch Up Inside" a butonului nostru cu metoda playMovie. Pentru a face acest lucru, deschideți-vă BigBuckBunnyViewController.xib în Interface Builder. CTRL + Faceți clic (sau faceți clic dreapta) pe butonul UIButton personalizat din centrul ecranului pentru a afișa acțiunile pentru acest element. Trageți din cercul de lângă "Touch Up Inside" la obiectul "Proprietarul fișierului", apoi selectați textul "playMovie:" care apare. Salvați progresul în Interface Builder înainte de a reveni la Xcode.

NOTĂ: Trebuie să selectați, de fapt, playMovie când pare să se termine acest pas. Asigurați-vă că salvați modificările!

Dacă construiți și depanați proiectul în acest moment, veți vedea că redarea filmului funcționează conform așteptărilor când atingeți UIButton personalizat. in orice caz, nu sărbătorim încă, pentru că nu suntem destul de terminați.

Așa cum am menționat anterior, am alocat în mod explicit memoria pentru obiectul moviePlayerController, dar nu am lansat încă acea memorie. Acesta este un scenariu interesant. Nu putem elibera în mod explicit obiectul în metoda pe care am alocat-o, deoarece filmul nostru va continua să fie redat la momentul finalizării acestei metode. De asemenea, nu este sigur să autorelaționați obiectul, deoarece nu știm dacă filmul nostru va continua să fie redat la următoarea dată când bazinul autorelease este golit. Din fericire, obiectul MPMoviePlayerController este preconfirmat pentru a face față acestui scenariu și va trimite o notificare numită MPMoviePlayerPlaybackDidFinishNotification la NSNotificationCenter la finalizarea redării. Pentru a primi această notificare, trebuie să înregistrăm un "observator" pentru a răspunde acestei notificări specifice. Pentru a face acest lucru, modificați-ne dai drumu la film după cum urmează:

 NSString * filepath = [[NSBundle mainBundle] caleForResource: @ "big-buck-bunny-clip" dinType: @ "m4v"]; NSURL * fileURL = [NSURL fișierURLWithPath: filepath]; MPMoviePlayerController * filmPlayerController = [[MPMoviePlayerController alocare] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (filmPlaybackComplete :) nume: Obiect MPMoviePlayerPlaybackDidFinishNotification: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = DA; [playPlayerController play]; 

Acum trebuie să creăm moviePlaybackComplete:, selectorul pe care tocmai l-am înregistrat. Adăugați următoarele sub dai drumu la film metodă:

 - (void) filmPlaybackComplete: (NSNotification *) notificare MPMoviePlayerController * moviePlayerController = [obiect notificare]; [[NSNotificationCenter defaultCenter] removeObserver: nume personal: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [releasePlayerController];  

Rețineți parametrul "obiect" pe care l-am setat moviePlayerController în dai drumu la film metoda de mai sus? Orice obiect ați setat pentru acea valoare este trimis împreună cu notificarea mai târziu. Pe linia 3, preluăm obiectul cu [obiect de notificare] declarație și referențiind-o cu un nou indicator pointer MPMoviePlayerController. Apoi, pe linia 4, trimitem din nou un mesaj către NSNotificationCenter, eliminând de această dată observatorul pe care l-am înregistrat dai drumu la film. Pe linia 8, ne curățăm controlerul de vizualizare personalizat eliminând vizualizarea filmPlayerController de pe afișajul nostru, iar pe linia 9 terminăm eliberând memoria pe care am alocat-o inițial în dai drumu la film metodă.

În acest moment, fișierul nostru de implementare ar trebui să arate astfel:

 #import "BigBuckBunnyViewController.h" @implementation BigBuckBunnyViewController - (IBAction) playMovie: (id) expeditor NSString * filepath = [[NSBundle mainBundle] pathForResource: @ big-buck-bunny-clip ofType: @ "m4v"]; NSURL * fileURL = [NSURL fișierURLWithPath: filepath]; MPMoviePlayerController * filmPlayerController = [[MPMoviePlayerController alocare] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (filmPlaybackComplete :) nume: Obiect MPMoviePlayerPlaybackDidFinishNotification: moviePlayerController]; [self.view addSubview: moviePlayerController.view]; moviePlayerController.fullscreen = DA; [playPlayerController play];  - (void) filmPlaybackComplete: (NSNotification *) notificare MPMoviePlayerController * moviePlayerController = [obiect notificare]; [[NSNotificationCenter defaultCenter] removeObserver: nume personal: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; [moviePlayerController.view removeFromSuperview]; [releasePlayerController];  - (void) dealloc [super dealloc];  @Sfârșit 

Felicitări! Ar trebui să aveți acum un jucător de film de lucru în cererea dumneavoastră. Restul acestui tutorial este dedicat personalizării jucătorului.

Pasul 4: Personalizați dimensiunea ecranului filmului

Opera dvs. din pasul anterior a permis să redați filme în modul ecran complet. Cu toate acestea, marea parte din îmbunătățirile MPMoviePlayerController din iOS 4 este că acum puteți specifica o dimensiune personalizată a afișajului pentru a fi redată în cadrul propriilor controlere de vizualizare. Pentru a profita de aceasta, modificați metoda playMovie după cum urmează:

 [moviePlayerController.view setFrame: CGRectMake (38, 100, 250, 163)]; [self.view addSubview: moviePlayerController.view]; //moviePlayerController.fullscreen = DA; [playPlayerController play]; 

Pe linia 1, creăm o dimensiune a cadrului personalizat pentru redarea filmului cu CGRectMake funcţie. Valorile pe care le-am introdus au fost luate de la Interface Builder și corespund originii, înălțimii și lățimii UIButtonului personalizat pe care îl folosim pentru a reda filmul. Rețineți că am comentat, de asemenea, comanda întreagă pe linia 4.

Dacă construiți și mergeți cu codul dvs. de proiect acum, ar trebui să vedeți că dând clic pe buton, acesta va reda acum videoclipul în cadrul controlerului de vizualizare personalizat, chiar în partea de sus a butonului UIButton. Acest lucru funcționează destul de bine, dar dacă vrei să muți butonul pentru a găsi aspectul potrivit? Este un pic dificil să copiați în permanență valorile literale CGRact. Actualizați metoda playMovie pentru a face acest lucru dinamic:

 -(IBAction) playMovie: (id) expeditor UIButton * playButton = (UIButton *) expeditor; NSString * filepath = [[NSBundle mainBundle] caleForResource: @ "big-buck-bunny-clip" dinType: @ "m4v"]; NSURL * fileURL = [NSURL fișierURLWithPath: filepath]; MPMoviePlayerController * filmPlayerController = [[MPMoviePlayerController alocare] initWithContentURL: fileURL]; [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (filmPlaybackComplete :) nume: Obiect MPMoviePlayerPlaybackDidFinishNotification: 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 = DA; [playPlayerController play];  

În linia 3 de mai sus, introducem parametrul "expeditor" către un obiect UIButton, deoarece știm că acesta este tipul de obiect care va trimite acest mesaj către controlerul nostru de vizualizare. Apoi, accesăm direct acest obiect pentru a obține originea X și Y a butonului, precum și lățimea și înălțimea butonului. Cu codul de mai sus implementat, suntem liberi să mutăm UIButton oriunde pe pânză și să nu ne temem de actualizarea constantă a apelului nostru de funcții CGRectMake.

Un cuvânt în modul Scaling

Când afișați un videoclip într-un dreptunghi personalizat, va trebui uneori să modificați scalingMode proprietatea obiectului MPMoviePlayerController. Setarea acestei proprietăți va determina modul în care se adaptează imaginea filmului pentru a umple dimensiunea de redare pe care ați definit-o. Setările de mod de scalare disponibile sunt după cum urmează:

  • MPMovieScalingModeNone
  • MPMovieScalingModeAspectFit
  • MPMovieScalingModeAspectFill
  • MPMovieScalingModeFill

Fiecare dintre opțiunile de mai sus funcționează așa cum s-ar putea aștepta, cu MPMovieScalingModeAspectFill și MPMovieScalingModeFill probabil fiind cele două modificări cele mai frecvent utilizate. Modul de scalare implicit este MPMovieScalingModeAspectFit.

Pentru a experimenta această proprietate în codul nostru, introduceți următoarea linie chiar înainte de [playPlayerController play] afirmație:

 moviePlayerController.scalingMode = MPMovieScalingModeFill; 

Veți vedea că videoclipul nostru acum umple tot spațiul disponibil în dreptunghiul de redare.

Concluzie

Acest tutorial a prezentat o introducere fundamentală în utilizarea clasei MPMoviePlayerController cu cadrul MediaPlayer. Clasa MPMoviePlayerController are opțiuni suplimentare pe care nu le-am abordat aici, dar voi lăsa explorarea acestora ca un exercițiu pentru cititor. Cu fundația din acest tutorial în locul dvs., ar trebui să puteți începe să experimentați pe cont propriu! Vă rugăm să lăsați orice feedback sau întrebări pe care le puteți avea în secțiunea de comentarii de mai jos. De asemenea, nu ezitați să trimiteți întrebări sau comentarii fie prin twitter@markhammonds personale, fie prin intermediul serviciului oficial Mobiletuts + twitter @mobtuts. Vă mulțumim pentru lectură și pentru cele mai bune șmecheri ale propriilor proiecte!

Cod