iOS kurz und bündig - Audio

iOS bietet mehrere Optionen für die Arbeit mit Audio. In diesem Kapitel stellen wir zwei Frameworks für den Umgang mit verschiedenen Arten von Sounds vor. Das Audio Toolbox Framework enthält eine C-Bibliothek zum Abspielen einfacher Systemklänge, und das AVFoundation Framework bietet eine objektorientierte Benutzeroberfläche für die Wiedergabe und Aufnahme auf mittlerer Ebene.

Für beide Frameworks ist die Interaktion mit Audiodateien konzeptionell gleichbedeutend mit der Interaktion mit Bildern. Sie verwenden weiterhin NSBundle, um die Datei auf der Festplatte zu lokalisieren, und laden den Inhalt anschließend in eine andere Klasse, die die verschiedenen Audioformate interpretiert.

Die Systemsound-API wird im Audio Toolbox Framework definiert. Das gesamte Framework ist in C und nicht in Objective-C geschrieben. Daher werden wir in der ersten Hälfte dieses Kapitels in einer iOS-Anwendung mit der C-Schnittstelle arbeiten. Dies ändert die Art und Weise, wie wir mit den wichtigsten iOS-Objekten interagieren, aber lassen Sie sich davon nicht erschrecken. Es handelt sich immer noch um dieselben Objekte und Konzepte wie in diesem gesamten Buch. Zum Beispiel anstelle von mainBundle Methode von NSBundle, Wir werden eine C-Funktion verwenden CFBundleGetMainBundle () um auf das Anwendungspaket zuzugreifen.


Beispielanwendung erstellen

Wie im vorigen Kapitel brauchen wir nur ein einfaches Einzelansicht-Anwendung. Erstellen Sie ein neues Projekt und rufen Sie es auf Audio. Wie üblich verwenden edu.selbst für die Firmenbezeichnung und iPhone für Geräte, und stellen Sie sicher, dass beide Verwenden Sie Storyboards und Verwenden Sie die automatische Referenzzählung Kontrollkästchen sind ausgewählt.

Im Gegensatz zum vorherigen Kapitel müssen wir auf zwei Audio-Frameworks zugreifen, die nicht in der Vorlage enthalten sind. Um dem Projekt ein neues Framework hinzuzufügen, klicken Sie auf das Projektsymbol in Projektnavigator und wähle das aus Audio Ziel. In dem Zusammenfassung Tab nach unten scrollen Verknüpfte Frameworks und Bibliotheken Sektion.


Abbildung 113: Die aktuell in unserem Projekt enthaltenen Frameworks

Dies sind die Codebibliotheken, auf die Sie vom Anwendungscode aus zugreifen können. Sie müssen das hinzufügen Audio Toolbox Framework Um mit Systemsounds zu arbeiten, klicken Sie auf das Pluszeichen in der unteren linken Ecke. Der resultierende Dialog enthält eine Liste aller verfügbaren Frameworks und Bibliotheken. Beginne zu tippen "audiotoolbox”In der Suchleiste, um den gewünschten Rahmen zu finden.


Abbildung 114: Suchen nach dem Audio Toolbox Framework

Klicken AudioToolbox.framework und klicken Sie dann auf Hinzufügen um es in das Projekt aufzunehmen. Wir brauchen auch Zugang zum AVFoundation Framework für die AVAudioPlayer Abschnitt dieses Kapitels, wiederholen Sie den Vorgang auch für diese Bibliothek. Sie sollten beide sehen AVFoundation.framework und AudioToolbox.framework in dem Zusammenfassung Registerkarte, bevor Sie fortfahren.


Abbildung 115: Alle für unser Beispielprojekt benötigten Bibliotheken

Wir können jetzt mit den System-Sounds und beginnen AVAudioPlayer.


Systemgeräusche

System-Sounds sind für einfache Zwecke wie Warnungen und UI-Soundeffekte (z. B. Klicken von Schaltflächen) konzipiert. Sie sind sehr einfach zu bedienen, aber der Nachteil ist, dass sie nicht viele Optionen für die Steuerung der Wiedergabe bieten. Die wichtigsten Einschränkungen der System-Sound-API sind folgende.

  • Sounds dürfen nicht länger als dreißig Sekunden sein.
  • Sie können die Lautstärke der Systemklänge nicht einstellen. Sie verwenden das aktuelle Gerätelaufwerk. Es kann immer nur ein Sound gleichzeitig gespielt werden.
  • Sounds können nicht nach einer bestimmten Verzögerung abgespielt oder abgespielt werden.
  • Sie unterstützen nur .caf-, .aif- und .wav-Dateien.
  • Es ist nicht möglich zu konfigurieren, wie Sounds mit eingehenden Anrufen umgehen.

Wenn Sie feststellen, dass diese zu einschränkend sind, sollten Sie den AVAudioPlayer verwenden, der weiter unten in diesem Kapitel beschrieben wird. Wieder sind Systemtöne für bestimmte Anwendungsfälle gedacht. Wenn Ihre Anwendung Sounds für mehr als Rückmeldungen und Alarme für die Benutzeroberfläche verwendet, sollten Sie sie wahrscheinlich verwenden AVAudioPlayer.

Zugriff auf die Sounddatei

Das Ressourcenpaket für dieses Buch enthält eine kurze Sounddatei mit dem Namen blip.wav. Fügen Sie dies dem Anwendungspaket hinzu, indem Sie es in das Verzeichnis ziehen Projektnavigator. Denken Sie daran, dass Systemtöne eine C-Schnittstelle verwenden. Daher greifen wir auf diese Datei mit einer etwas anderen Methode als in den vorherigen Kapiteln zu. Im ViewController.m, Veränderung viewDidLoad Zu dem Folgendem.

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

CFBundleGetMainBundle () ist im Wesentlichen das gleiche wie [[NSBundle] mainBundle], Es gibt jedoch das CoreFoundation-Objekt zurück, das das Anwendungspaket anstelle der Version des Foundation Framework darstellt. Das CoreFoundation Framework ist eine untergeordnete Alternative zum Stiftungsrahmen. Wir müssen verwenden CoreFoundation Objekte hier, weil dies die Audio-Toolbox als Argument akzeptiert.

Das CFBundleCopyResourceURL () ist die CoreFoundation-Version von NSBundle pathForResource: ofType: Methode. Es gibt einfach den Pfad zur angeforderten Ressource zurück, und Sie sollten einen vertrauten Dateipfad in sehen NSLog () Ausgabe.

Wenn Sie einen Pfad zur Sounddatei haben, müssen Sie ein Soundobjekt mit der. Erstellen AudioServicesCreateSystemSoundID () Funktion. Fügen Sie Folgendes zu hinzu viewDidLoad.

 AudioServicesCreateSystemSoundID (blipURL, & _blipOne);

Diese Funktion liest den Inhalt der Sounddatei ein, wandelt sie in ein Soundobjekt um, das die Sound-API des Systems für die Wiedergabe kennt, und gibt eine ID zurück, mit der Sie später darauf zurückgreifen können. AudioServicesCreateSystemSoundID () wird vom Audio Toolbox Framework definiert, daher müssen Sie es in importieren ViewController.m bevor du es benutzen kannst. Fügen Sie am Anfang der Datei Folgendes hinzu.

 #einführen 

Sie speichern die ID des Soundobjekts in einer privaten Instanzvariablen namens _blip, Fügen Sie dies auch der Implementierungsdeklaration hinzu.

 @implementation ViewController SystemSoundID _blip;  Sounds abspielen Als nächstes fügen Sie der Szene eine Schaltfläche programmatisch hinzu. Diese Schaltfläche gibt den Ton wieder, wenn Sie darauf klicken. UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Blip" fürState: UIControlStateNormal]; [aButton addTarget: Eigenaktion: @selector (playBlip :) forControlEvents: UIControlEventTouchUpInside]; aButton.frame = CGRectMake (100.0, 200.0, 120.0, 40.0); [[self view] addSubview: aButton]; Für die Aktion playBlip: rufen wir die Funktion AudioServicesPlaySystemSound () auf, um den Sound abzuspielen. Es akzeptiert ein einzelnes Argument, das die SystemSoundID sein sollte, die auf das gewünschte Soundobjekt verweist (z. B. _blip). - (void) playBlip: (id) Absender AudioServicesPlaySystemSound (_blip); 

Wenn Sie das Projekt kompilieren, sollten Sie in der Lage sein, auf die Schaltfläche zu klicken und einen kurzen Ton zu hören. Stellen Sie sicher, dass Ihre Lautsprecher nicht stummgeschaltet sind.


Abbildung 116: Eine blipping Taste

Wenn Sie auf die Schaltfläche klicken, während der Sound noch abgespielt wird, werden Sie feststellen, dass iOS den aktuellen Sound abbricht und mit einem neuen beginnt. System-Sounds sind wiederum für UI-Soundeffekte und andere unkomplizierte Anwendungen gedacht. Um mehrere Sounds gleichzeitig abzuspielen, müssen Sie ein Upgrade auf die AVAudioPlayer im folgenden Abschnitt besprochen.

AudioServicesCreateSystemSoundID () und AudioServicesPlaySystemSound () sind so ziemlich alles, was es mit Systemklängen gibt. Sie können auch das finden AudioServicesPlayAlertSound () Funktion nützlich. Es funktioniert genau so AudioServicesPlaySystemSound (), Das Telefon vibriert jedoch, wenn der Benutzer es aktiviert hat.


AVAudioPlayer

Das AVFoundation Framework bietet eine übergeordnete Benutzeroberfläche für die Verwaltung der Audiowiedergabe. Bei Spielen, benutzerdefinierten Musikplayern und anderen Apps, die ausgefeilte Audiosteuerung erfordern, sollten Sie dieses Framework verwenden. Einige seiner Fähigkeiten umfassen:

  • Keine Begrenzung der Klangdauer.
  • Sie können mehrere Sounds gleichzeitig abspielen.
  • Die Lautstärke kann für einzelne Sounds eingestellt werden.
  • Es ist möglich, einen Sound zu schleifen oder andere Aktionen auszuführen, wenn die Wiedergabe beendet ist.
  • Sie können zu beliebigen Punkten in der Sounddatei springen.
  • Das Verhalten für die Behandlung von Unterbrechungen durch ein Delegate-Objekt lässt sich leicht konfigurieren.

AVAudioPlayer ist die Hauptklasse, die Sie von der verwenden AV-Gründung Rahmen. Es bietet eine objektorientierte Möglichkeit, die Lautstärke einzustellen, den Sound abzuspielen, den Sound anzuhalten, den zu spielenden Ton festzulegen und so weiter. Sie können es sich als das Audio-Äquivalent von vorstellen UIImage / UIImageView.

Zu den unterstützten Dateiformaten für AVAudioPlayer gehören .m4a, .aac, .wav, .mp3, .aif, .pcm, .caf und einige andere. Eine ausführliche Beschreibung der Audiodateiformate finden Sie im Multimedia-Programmierhandbuch von Apple.

Zugriff auf den Song

AVAudioPlayer wurde für längere Sounddateien wie Songs entwickelt. Daher haben wir mit diesem Buch ein gemeinnütziges Billie Holiday-Musikstück verteilt. Zieh den Guten-Morgen-Herzschmerz.mp3 Datei aus dem Ressourcenpaket in die Projektnavigator um es dem Bundle hinzuzufügen.

Schon seit AV-Gründung ist eine Objective-C-Bibliothek. Wir können NSBundle für den Zugriff auf Medienassets verwenden. Gehen Sie voran und entfernen Sie alles viewDidLoad, und ersetze es durch folgendes.

 NSURL * soundFileURL = [[NSBundle mainBundle] URLForResource: @ "good-morning-heartache" withExtension: @ "mp3"]; _player = [[AVAudioPlayer-Zuordnung] initWithContentsOfURL: SoundFileURL-Fehler: Null];

Das URLForResource: withExtension: Methode ist das NSURL-Äquivalent zu pathForResource: ofType:. Dies war eine bessere Option für das Finden der Audiodatei, da Sie ein NSURL-Objekt zum Initialisieren der Datei benötigten AVAudioPlayer. Das initWithContentsOfURL: Fehler: Methode lädt den Inhalt der Sounddatei in die AVAudioPlayer So ähnlich wie bei NSString stringWithContentsOfURL: Kodierung: Fehler: Methode.

AVAudioPlayer befindet sich in der AVFoundation-Bibliothek. Fügen Sie daher unbedingt die folgende import-Anweisung hinzu ViewController.h. Wir müssen später über die Header-Datei darauf zugreifen.

 #einführen 

Außerdem benötigen Sie einige private Instanzvariablen. Ändern Sie die Implementierungsdeklaration wie folgt.

 @implementation ViewController AVAudioPlayer * _player; UIButton * _playButton; UIButton * _stopButton;  Abspielen des Songs Als Nächstes fügen Sie der Szene einen Play-Button hinzu: _playButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [_playButton setTitle: @ "Play" fürState: UIControlStateNormal]; [_playButton addTarget: Eigenaktion: @selector (playOrPause :) forControlEvents: UIControlEventTouchUpInside]; _playButton.frame = CGRectMake (100.0, 170.0, 120.0, 40.0); [[self view] addSubview: _playButton]; Die Aktion playOrPause: sollte folgendermaßen implementiert werden: - (void) playOrPause: (id) sender if (_player.playing) [_player pause]; [_playButton setTitle: @ "Play" fürState: UIControlStateNormal];  else [_player play]; [_playButton setTitle: @ "Pause" forState: UIControlStateNormal]; 

Dies prüft, ob der Song bereits über abgespielt wird AVAudioPlayer Eigentum zu spielen. Wenn dies der Fall ist, unterbricht er den Titel mit der Pause-Methode und ändert den Titel der Schaltfläche entsprechend. Ist dies nicht der Fall, wird der Song durch Aufrufen der Abspielmethode gestartet. Sie sollten jetzt in der Lage sein, die App zu kompilieren und einen Song abzuspielen oder anzuhalten, indem Sie auf die Schaltfläche tippen.

Gehen wir noch einen Schritt weiter, indem wir eine Halt Taste. Fügen Sie Folgendes dem hinzu viewDidLoad Methode.

 _stopButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [_stopButton setTitle: @ "Stop" fürState: UIControlStateNormal]; [_stopButton addTarget: Selbstaktion: @selector (stop :) forControlEvents: UIControlEventTouchUpInside]; _stopButton.frame = CGRectMake (100.0, 230.0, 120.0, 40.0); [[self view] addSubview: _stopButton]; [/ sourcecode] Die entsprechende Aktion ruft die stop-Methode des AVAudioPlayer auf. Beachten Sie, dass diese Methode die aktuelle Wiedergabeposition nicht ändert. Sie unterscheidet sich von der Pause-Methode nur dadurch, dass sie das durch die Wiedergabemethode durchgeführte Vorladen rückgängig macht. Um an den Anfang des Songs zu springen, wie Sie es von einer typischen Stop-Schaltfläche erwarten würden, müssen Sie die currentTime-Eigenschaft von AVAudioPlayer wie folgt manuell einstellen:

[Sourcecode] - (void) stop: (id) Sender [_player stop]; _player.currentTime = 0; [_playButton setTitle: @ "Play" fürState: UIControlStateNormal];

AVAudioPlayer-Delegierte

Ein weiterer Vorteil der Verwendung AVAudioPlayer Über die System-Sounds-API können Sie Unterbrechungen mit dem vertrauten Delegatenmuster behandeln. Das AVAudioPlayerDelegate Protokoll definiert eine Reihe von Methoden, mit denen Sie wissen, wann bestimmte Ereignisse außerhalb Ihrer Anwendung auftreten.

Wenn eine Unterbrechung wie ein eingehender Anruf beginnt, wird die audioPlayerBeginInterruption: Die Methode wird für das Delegate-Objekt aufgerufen. Der Ton wird automatisch angehalten. Dies gibt Ihnen jedoch die Möglichkeit, jeden anderen benutzerdefinierten Code für die Handhabung zu schreiben, den Sie benötigen. Ebenso die audioPlayerEndInterruption: withOptions: Die Methode wird aufgerufen, wenn die Unterbrechung beendet ist und Sie den Audioplayer erneut verwenden können. Das System setzt die Wiedergabe jedoch nicht automatisch fort. Sie müssen die Abspielmethode manuell aufrufen, wenn dies gewünscht wird.

Zusätzlich zur Unterbrechungsbehandlung informiert Sie das Delegate-Objekt darüber, wann der Sound beendet ist. Durch die Definition eines audioPlayerDidFinishPlaying: erfolgreich: Methode für das Delegat-Objekt können Sie benutzerdefinierte Bereinigungsarbeiten durchführen. So können Sie beispielsweise die Wiedergabetaste zurücksetzen und an den Anfang des Songs zurückspringen.

 - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) - Player erfolgreich: (BOOL) -Flag [Selbststopp: Null]; NSLog (@ "Song beendet!"); 

Damit dieser Code funktioniert, müssen Sie den View-Controller zu einem formalen Delegierten für die AVAudioPlayer. Im ViewController.h, Ändern Sie die Schnittstellendeklaration wie folgt.

 @Interface ViewController: UIViewController 

Dann muss der View-Controller sich selbst als Delegatobjekt zuweisen. In dem viewDidLoad Methode von ViewController.m, fügen Sie die folgende Zeile hinzu.

 _player.delegate = self;

Wenn Sie nun den Song bis zum Ende durchlaufen lassen, wird die Pause Taste wird automatisch wieder in eine abspielen Wenn Sie auf die Schaltfläche klicken, wird der Song von Anfang an gestartet.


Abbildung 117: Unser einfacher Musikplayer

Zusammenfassung

In diesem Kapitel haben wir zwei Möglichkeiten zur Wiedergabe von Audio von einem iOS-Gerät beschrieben: Systemtöne und AVAudioPlayer. Ersteres sollte nur für kurze, einfache Sounds verwendet werden, für die keine benutzerdefinierte Konfiguration erforderlich ist, und letzteres gibt Ihnen mehr Kontrolle über die Audiowiedergabe.

Für die durchschnittliche iOS-App die AVFoundation Framework Bietet eine gute Balance zwischen einer benutzerfreundlichen API und einer präzisen Steuerung Ihrer Sounds. Beachten Sie jedoch, dass iOS auch erweiterte Audiofunktionen auf niedrigerer Ebene wie Audio Queue Services sowie eine übergeordnete API für die Interaktion mit der vorhandenen iTunes-Bibliothek des Benutzers über das Media Player Framework bietet. Für spezielle Anwendungen können Sie sogar OpenAL aufrufen, eine plattformübergreifende Bibliothek zur Simulation einer 3D-Audioumgebung.

Es wurde viel Arbeit aufgewendet, um iOS zu einer multimedialen Plattform zu machen, so dass es an Optionen für das Verwalten von Bildern, Sounds und Videos innerhalb Ihrer Anwendung nicht mangelt.


Fazit

In diesem Kapitel wurden die Grundlagen der iOS-App-Entwicklung beschrieben. Wir haben mit dem Aufbau einer einfachen Benutzeroberfläche begonnen, die uns mit den grundlegenden Entwurfsmustern von iOS vertraut machte: Model-View-Controller, Delegieren von Objekten und Target-Action. Dann haben wir uns mit Multi-Scene-Anwendungen befasst und erfahren, wie iOS Szenen miteinander kommunizieren lässt und automatisch Übergänge von einer Szene zur anderen handhabt. Anschließend wurden das iOS-Dateisystem, Anwendungspakete und erforderliche Ressourcen wie App-Symbole, Startbilder und die Liste der Eigenschaften von Informationen beschrieben. Zufälligerweise waren Bundles auch die Methode, um Anwendungen in mehreren Regionen in iOS zu lokalisieren. So konnten wir übersetzte Bilder und Texte mühelos verschiedenen Sprechern zur Verfügung stellen. Schließlich haben wir uns einen kurzen Überblick über die Audiofunktionen verschafft, indem wir einen einfachen UI-Soundeffekt und einen Musikplayer erstellt haben.

Zwar gibt es noch Dutzende von Frameworks, die Sie alleine erkunden können, aber ich hoffe, dass Sie sich beim Navigieren in einem Xcode-Projekt wohl fühlen. Neben einigen praktischen Erfahrungen sollten Sie sich dieses Buch nicht entgehen lassen. Es ist ein umfassendes Verständnis der iOS-Architektur. Wie Schnittstellen mit UIKit und Storyboards erstellt und angeordnet werden und welche Klassen und Bibliotheken für die Verwaltung von Medienassets verwendet werden . Mit diesem Wissen ausgestattet, sollten Sie mehr als bereit sein, sich in die reale Welt der iOS-App-Entwicklung zu begeben.

Diese Lektion repräsentiert ein Kapitel aus iOS Prägnant, ein kostenloses eBook aus dem Team von Syncfusion.