iOS Succinctly - Audio

iOS oferă mai multe opțiuni pentru lucrul cu audio. În acest capitol, vom introduce două cadre pentru a trata diferite tipuri de sunete. Framework Audio Toolbox include o bibliotecă C pentru redarea sunetelor simple de sistem, iar AVFoundation Framework oferă o interfață orientată pe obiecte pentru redarea și înregistrarea la nivel intermediar.

Pentru ambele cadre, interacțiunea cu fișierele audio este conceptuală la fel ca interacțiunea cu imaginile. Încă mai folosiți NSBundle pentru a localiza fișierul pe disc și apoi încărcați conținutul cu o altă clasă dedicată interpretării diferitelor formate audio.

API-ul de sunet al sistemului este definit în Cadrul de instrumente audio. Acest cadru întreg este scris în C în loc de Obiect-C, așa că vom lucra cu interfața C într-o aplicație iOS pentru prima jumătate a acestui capitol. Acest lucru schimbă modul în care vom interacționa cu obiectele de bază iOS, dar nu lăsați asta să te sperie. Încă ne confruntăm cu aceleași obiecte și concepte ca și noi pe parcursul întregii cărți. De exemplu, în loc să utilizați mainBundle Metodă de NSBundle, vom folosi o funcție C numită CFBundleGetMainBundle () pentru a accesa pachetul de aplicații.


Crearea aplicației de exemplu

Ca și în capitolul precedent, tot ce vom avea nevoie este simplu Vizualizare individuală. Creați un proiect nou și sunați-l Audio. Ca de obicei, utilizați edu.self pentru Identificatorul companiei și iPhone pentru dispozitive, și asigurați-vă că ambele Folosiți panourile de știri și Utilizați numărarea automată a referințelor sunt selectate casetele de selectare.

Spre deosebire de capitolul precedent, trebuie să accesăm două cadre audio, care nu sunt incluse în șablon. Pentru a adăuga un nou cadru proiectului, dați clic pe pictograma proiectului din Project Navigator și selectați Audio ţintă. În rezumat filă, derulați în jos până la Cadrele și bibliotecile asociate secțiune.


Figura 113: Cadrele incluse în prezent în proiectul nostru

Acestea sunt bibliotecile de cod la care aveți acces din codul aplicației. Trebuie să adăugați Cadru de instrumente audio pentru a lucra cu sunete ale sistemului, faceți clic pe semnul plus din colțul din stânga jos. Dialogul rezultat conține o listă a tuturor cadrelor și bibliotecilor disponibile. Începe să tastezi "audiotoolbox"În bara de căutare pentru a găsi cadrul dorit.


Figura 114: Căutarea cadrului de instrumente audio

Clic AudioToolbox.framework apoi faceți clic pe Adăuga să o includem în proiect. De asemenea, vom avea nevoie de acces la Cadrul AVFoundation pentru AVAudioPlayer parte a acestui capitol, așa că repetați și procesul pentru această bibliotecă. Ar trebui să vedeți amândouă AVFoundation.framework și AudioToolbox.framework în rezumat înainte de a porni.


Figura 115: Toate bibliotecile necesare pentru proiectul nostru de exemplu

Suntem gata să începem să lucrăm cu sunetele sistemului și AVAudioPlayer.


Sunete de sistem

Sunetele sistemului sunt concepute pentru a fi utilizate pentru lucruri simple precum alerte și efecte sonore ale UI (de exemplu clicuri pe butoane). Ele sunt foarte ușor de folosit, dar comerțul off este că nu oferă multe opțiuni pentru controlul redării. Principalele limitări ale sistemului API pentru sunetul sistemului sunt următoarele.

  • Sunetele nu pot fi mai lungi de treizeci de secunde.
  • Nu puteți controla volumul sonor al sistemului. Ei folosesc volumul curent al dispozitivului. Numai un singur sunet poate juca la un moment dat.
  • Sunetele nu pot fi bucle sau redate după o anumită întârziere.
  • Ele suportă doar fișierele .caf, .aif și .wav.
  • Nu este posibil să configurați modul în care sunetele tratează întreruperile ca apelurile primite.

Dacă considerați că acestea sunt prea restrictive, ar trebui să utilizați AVAudioPlayer discutat mai târziu în acest capitol. Din nou, sunetele sistemului sunt destinate cazurilor specifice de utilizare. Dacă aplicația dvs. folosește sunete pentru feedback și alerte mai mult decât UI, probabil că ar trebui să le utilizați AVAudioPlayer.

Accesarea fișierului de sunet

Pachetul de resurse pentru această carte conține un scurt fișier de sunet numit blip.wav. Adăugați acest lucru în pachetul de aplicații prin tragerea acestuia în Project Navigator. Amintiți-vă că sunetul sistemului folosește o interfață C, deci vom accesa acest fișier utilizând o metodă puțin diferită de cea a capitolelor anterioare. În ViewController.m, Schimbare viewDidLoad la următoarele.

 - (vid) viewDidLoad [super viewDidLoad]; CFURLRef blipURL = CFBundleCopyResourceURL (CFBundleGetMainBundle (), CFSTR ("blip"), CFSTR ("wav"), NULL); NSLog (@ "% @", blipURL); 

CFBundleGetMainBundle () este, în esență, aceeași ca [[NSBundle] mainBundle], cu excepția faptului că returnează obiectul CoreFoundation care reprezintă pachetul de aplicații în locul versiunii Foundation Framework. CoreFoundation Cadrul este o alternativă la nivel inferior Cadrul de bază. Trebuie să folosim CoreFoundation obiecte aici pentru că asta acceptă ca instrumente de instrumente de instrumente audio.

CFBundleCopyResourceURL () este versiunea CoreFoundation a lui NSBundle pathForResource: ofType: metodă. Pur și simplu returnează calea către resursa solicitată și ar trebui să vedeți o cale familiară de fișiere în NSLog () producție.

Odată ce aveți o cale către fișierul de sunet, trebuie să creați un obiect de sunet folosind AudioServicesCreateSystemSoundID () funcţie. Adăugați următoarele la viewDidLoad.

 AudioServicesCreateSystemSoundID (blipURL, & _blipOne);

Această funcție citește în conținutul fișierului de sunet, îl transformă într-un obiect de sunet pe care API-ul de sunet al sistemului cunoaște cum se joacă și returnează un ID pe care îl puteți folosi pentru a îl referi mai târziu. AudioServicesCreateSystemSoundID () este definită de Framework Audio Toolbox, deci trebuie să-l importați ViewController.m înainte de ao folosi. Adăugați următoarele în partea de sus a fișierului.

 #import 

Stocați ID-ul obiectului de sunet într-o variabilă de instanță privată numită _blip, astfel încât să adăugați și declarația de punere în aplicare.

 @implementation ViewController SystemSoundID _blip;  Redarea sunetului Apoi, adăugați programatic un buton la scenă; acel buton va reda sunetul când se face clic. UIButton * aButton = [butonul UIButtonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Blip" pentruState: UIControlStateNormal]; [aButton addTarget: acțiune auto: @selector (playBlip :) forControlEvents: UIControlEventTouchUpInside]; aButton.frame = CGRectMake (100,0, 200,0, 120,0, 40,0); [[vizualizare de sine] addSubview: aButton]; Pentru acțiunea playBlip: vom apela funcția AudioServicesPlaySystemSound () pentru a reda sunetul. Acceptă un singur argument, care ar trebui să fie SystemSoundID care se referă la obiectul de sunet dorit (de exemplu, _blip). - (void) playBlip: (id) expeditor AudioServicesPlaySystemSound (_blip); 

Când compilați proiectul, ar trebui să puteți să faceți clic pe buton și să auziți un sunet scurt. Asigurați-vă că difuzoarele dvs. nu sunt dezactivate.


Figura 116: Un buton de alunecare

Dacă faceți clic pe buton în timp ce sunetul continuă să fie redat, veți observa că iOS anulează sunetul actual și începe o nouă înregistrare. Din nou, sunetele sistemului sunt destinate pentru efecte sonore UI și alte aplicații simple. Pentru a reda mai multe sunete simultan, va trebui să faceți upgrade la AVAudioPlayer discutate în secțiunea următoare.

AudioServicesCreateSystemSoundID () și AudioServicesPlaySystemSound () sunt destul de mult tot ce există la sunete de sistem. Puteți găsi, de asemenea, AudioServicesPlayAlertSound () funcția utilă. Funcționează exact așa AudioServicesPlaySystemSound (), dar face ca telefonul să vibreze dacă acesta este activat.


AVAudioPlayer

Cadrul AVFoundation oferă o interfață de nivel superior pentru gestionarea redării audio. Pentru jocuri, muzică personalizată și alte aplicații care necesită controale audio sofisticate, acesta este cadrul pe care trebuie să-l utilizați. Printre capabilitățile sale se numără:

  • Nicio limitare a duratei sunetului.
  • Puteți reda mai multe sunete în același timp.
  • Volumul poate fi controlat pentru sunete individuale.
  • Este posibil să creezi un sunet sau să faci alte acțiuni când termină să joci.
  • Puteți sări la puncte arbitrare din fișierul de sunet.
  • Este ușor să configurați comportamentul pentru a gestiona întreruperile printr-un obiect delegat.

AVAudioPlayer este clasa principală pe care o veți utiliza de la platformei AV Foundation Cadru. Acesta oferă un mod orientat pe obiecte pentru a seta volumul, a reda sunetul, a opri sunetul, a specifica ce parte a sunetului să fie redată și așa mai departe. Vă puteți gândi la acesta ca la echivalentul audio al lui UIImage / UIImageView.

Formatele de fișier acceptate pentru AVAudioPlayer includ .m4a, .aac, .wav, .mp3, .aif, .pcm, .caf și câteva altele. Consultați Ghidul de programare multimedia al Apple pentru o discuție detaliată a formatelor de fișiere audio.

Accesarea melodiei

AVAudioPlayer este conceput pentru a fi utilizat cu fișiere audio mai lungi, cum ar fi melodii, așa că am distribuit o melodie Billie Holiday în domeniul public cu această carte. Trageți buna-dimineata-heartache.mp3 fișier din pachetul de resurse în Project Navigator pentru ao adăuga la pachet.

De cand platformei AV Foundation este o bibliotecă Obiectiv-C, putem reveni la utilizarea NSBundle pentru a accesa activele media. Mergeți și scoateți totul viewDidLoad, și înlocuiți-l cu următoarele.

 NSURL * soundFileURL = [[NSBundle mainBundle] URLForResource: @ "good-morning-heartache" cu Extensie: @ "mp3"]; _player = [[Alocare AVAudioPlayer] initWithContentsOfURL: eroare soundFileURL: zero];

URLForResource: withExtension: metoda este NSURL echivalent cu pathForResource: ofType:. Aceasta a fost o opțiune mai bună pentru găsirea fișierului audio, deoarece aveați nevoie de un obiect NSURL pentru a inițializa AVAudioPlayer. initWithContentsOfURL: eroare: metoda încarcă conținutul fișierului de sunet în AVAudioPlayer exemplu, la fel ca NSString stringWithContentsOfURL: codare: eroare: metodă.

AVAudioPlayer se află în biblioteca AVFoundation, deci asigurați-vă că adăugați următoarea instrucțiune de import la ViewController.h. Va trebui să-l accesăm din fișierul antet mai târziu.

 #import 

În plus, veți avea nevoie de câteva variabile de instanță private. Modificați declarația de punere în aplicare la următoarele.

 @implementation ViewController AVAudioPlayer * _player; UIButton * _playButton; UIButton * _stopButton;  Redarea melodiei următoare, adăugați un buton Play la scenă: _playButton = [butonul UIButtonWithType: UIButtonTypeRoundedRect]; [_playButton setTitle: @ "Play" pentruState: UIControlStateNormal]; [_playButton addTarget: acțiunea de sine: @selector (playOrPause :) forControlEvents: UIControlEventTouchUpInside]; _playButton.frame = CGRectMake (100.0, 170.0, 120.0, 40.0); [[vizualizare de sine] addSubview: _playButton]; Acțiunea playOrPause: ar trebui implementată astfel: - (void) playOrPause: (id) expeditor if (_player.playing) [pauză _player]; [_playButton setTitle: @ "Play" pentruState: UIControlStateNormal];  altceva [playplay play]; [_playButton setTitle: @ "Pauză" pentruState: UIControlStateNormal]; 

Aceasta verifică dacă melodia se joacă deja lui AVAudioPlayer jucând proprietatea. Dacă este, se oprește melodia folosind metoda pauzei și se modifică în mod corespunzător titlul butonului. Dacă nu este, începe melodia apelând metoda de redare. Acum ar trebui să puteți compila aplicația și să redați sau să întrerupeți o melodie atingând butonul.

Să facem un pas mai departe prin crearea unui Stop buton. Adăugați următoarele la viewDidLoad metodă.

 _stopButton = [Butonul UIButtonWithType: UIButtonTypeRoundedRect]; [_stopButton setTitle: @ "Stop" pentruState: UIControlStateNormal]; [_stopButton addTarget: acțiunea de sine: @selector (stop :) forControlEvents: UIControlEventTouchUpInside]; _stopButton.frame = CGRectMake (100.0, 230.0, 120.0, 40.0); [[vizualizare de sine] addSubview: _stopButton]; [/ sourcecode] Acțiunea corespunzătoare solicită metoda de oprire a AVAudioPlayer. Rețineți că această metodă nu modifică poziția curentă de redare - aceasta diferă de metoda pauzei numai prin faptul că anulează preîncărcarea efectuată de metoda de redare. Pentru a reveni la începutul melodiei, așa cum v-ați aștepta de la un buton tipic Stop, trebuie să setați manual proprietatea curentă a AVAudioPlayer, astfel:

[sourcecode] - (void) oprire: (id) expeditor [_player stop]; _player.currentTime = 0; [_playButton setTitle: @ "Play" pentruState: UIControlStateNormal];

AVAudioPlayer Delegați

Un alt avantaj al utilizării AVAudioPlayer peste sistemul de sunete API este că vă permite să gestionați întreruperile utilizând modelul delegat familiar. AVAudioPlayerDelegate protocol definește o serie de metode care vă anunță când anumite evenimente apar în afara aplicației.

Când începe o întrerupere ca un apel telefonic, audioPlayerBeginInterruption: se solicită metoda obiect delegat. Sunetul se va întrerupe automat, dar acest lucru vă oferă șansa de a scrie orice alt cod de manipulare personalizat de care aveți nevoie. De asemenea, audioPlayerEndInterruption: withOptions: metoda se numește atunci când întreruperea se termină și puteți utiliza playerul audio din nou. Cu toate acestea, sistemul nu reia automat redarea. Trebuie să apelați manual metoda de redare dacă doriți să se întâmple acest lucru.

În plus față de manipularea întreruperilor, obiectul delegat vă permite să știți și când sunetul a terminat de redat. Prin definirea unui audioPlayerDidFinishPlaying: cu succes: pe obiectul delegat, puteți face munca personalizată de curățare. De exemplu, puteți folosi acest lucru pentru a reseta butonul de redare și pentru a reveni la începutul melodiei, așa cum este.

 - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player cu succes: (BOOL) flag auto stop: zero]; NSLog (@ "Song terminat de joc!"); 

Pentru ca acest cod să funcționeze, trebuie să îl transformați pe controlorul vizual într-un delegat oficial pentru AVAudioPlayer. În ViewController.h, modificați declarația de interfață la următoarele.

 @ interfață ViewController: UIViewController 

Apoi, controlerul de vizualizare trebuie să se atribuie ca obiect delegat. În viewDidLoad Metodă de ViewController.m, adăugați următoarea linie.

 _player.delegate = auto;

Acum, dacă lăsați melodia să se joace până la capăt, Pauză butonul va reveni automat înapoi în a Joaca butonul, și făcând clic pe acesta, va porni melodia de la început.


Figura 117: playerul nostru simplu de muzică

rezumat

În acest capitol am discutat două moduri de a reda audio de pe un dispozitiv iOS, sună și sistemul AVAudioPlayer. Primul trebuie folosit numai pentru sunete scurte și simple care nu necesită multă configurație personalizată, iar acesta din urmă vă oferă mai mult control asupra redării audio.

Pentru aplicația medie pentru iOS, Cadrul AVFoundation oferă un echilibru bun între un API ușor de utilizat și controlul fin al sunetelor. Dar, rețineți că iOS oferă, de asemenea, capabilități audio avansate, de nivel inferior, cum ar fi Audio Queue Services, precum și un API de nivel superior pentru a interacționa cu biblioteca iTunes existentă a utilizatorului prin intermediul Media Player Framework. Pentru aplicații specializate, puteți chiar să lansați în OpenAL, o bibliotecă cross-platform pentru simularea unui mediu audio 3D.

O mulțime de lucruri au avut loc în a face iOS o platformă prietenoasă multimedia, deci nu există nici o lipsă de opțiuni pentru gestionarea imaginilor, sunetelor și videoclipurilor din aplicația dvs..


Concluzie

Acest capitol se referă la elementele de bază ale dezvoltării aplicației iOS. Am inceput prin construirea unei interfete simple de utilizare, care ne-a prezentat modelele de design fundamentale ale iOS: model-view-controller, obiecte delegate si target-action. Apoi am scos în aplicații cu mai multe scenarii și am învățat cum iOS permite scenelor să comunice între ele și să traverseze automat tranzițiile de la o scenă la alta. După aceea, am discutat despre sistemul de fișiere iOS, pachetele de aplicații și resursele necesare, cum ar fi pictogramele aplicațiilor, imaginile de lansare și lista de proprietăți a informațiilor. Bundle, de asemenea, sa întâmplat să fie metoda de localizare a aplicațiilor în mai multe regiuni din iOS, astfel că am reușit să deservăm cu ușurință imagini și texte traduse difuzoarelor de limbi diferite. În cele din urmă, am aruncat o scurtă privire asupra capabilităților audio, creând un efect de sunet simplu și un player muzical.

În timp ce mai sunt încă zeci de cadre pentru a explora pe cont propriu, sper că vă simțiți confortabil navigând un proiect Xcode. Împreună cu o experiență practică, ce ar trebui să luați de la această carte este o înțelegere la nivel înalt a arhitecturii iOS - cum sunt create interfețele și care sunt create folosind UIKit și storyboard-uri și ce clase și biblioteci să utilizeze pentru a gestiona activele media . Înarmat cu aceste cunoștințe, ar trebui să fii mai mult decât gata să te aventurezi în lumea reală a dezvoltării aplicațiilor iOS.

Această lecție reprezintă un capitol din iOS Succinct, o carte electronică gratuită de la echipa de la Syncfusion.

Cod