iOS succinctement - Audio

iOS fournit plusieurs options pour travailler avec l'audio. Dans ce chapitre, nous présenterons deux cadres pour traiter différents types de sons. Audio Toolbox Framework comprend une bibliothèque C pour la lecture de sons système simples et AVFoundation Framework fournit une interface orientée objet pour la lecture et l'enregistrement de niveau intermédiaire..

Dans les deux cas, interagir avec des fichiers audio est conceptuellement identique à interagir avec des images. Vous utilisez toujours NSBundle pour localiser le fichier sur le disque, puis chargez son contenu dans une autre classe dédiée à l'interprétation des différents formats audio..

L'API de son système est définie dans la structure Audio Toolbox. Tout ce framework est écrit en C au lieu d'Objective-C, nous allons donc utiliser l'interface C dans une application iOS pour la première moitié de ce chapitre. Cela change la façon dont nous allons interagir avec les objets iOS principaux, mais ne vous laissez pas effrayer. Nous traitons toujours avec les mêmes objets et concepts que nous avons été tout au long de ce livre. Par exemple, au lieu d’utiliser le groupe principal méthode de NSBundle, nous allons utiliser une fonction C appelée CFBundleGetMainBundle () accéder au dossier de candidature.


Création de l'exemple d'application

Comme dans le chapitre précédent, tout ce dont nous aurons besoin est un simple Application à vue unique. Créer un nouveau projet et l'appeler l'audio. Comme d'habitude, utilisez edu.self pour le Identifiant de l'entreprise et iPhone pour appareils, et assurez-vous que le Utiliser des storyboards et Utiliser le comptage automatique des références les cases à cocher sont sélectionnées.

Contrairement au chapitre précédent, nous devons accéder à deux frameworks audio, qui ne sont pas inclus dans le modèle. Pour ajouter un nouveau framework au projet, cliquez sur l’icône du projet dans le menu déroulant. Navigateur de projet et sélectionnez le l'audio cible. dans le Résumé onglet, faites défiler jusqu'au Cadres et bibliothèques liés section.


Figure 113: Les cadres actuellement inclus dans notre projet

Ce sont les bibliothèques de code auxquelles vous avez accès à partir du code de l'application. Vous devez ajouter le Cadre de la boîte à outils audio Pour pouvoir utiliser les sons du système, cliquez sur le signe plus dans le coin inférieur gauche. La boîte de dialogue qui en résulte contient une liste de tous les frameworks et bibliothèques disponibles. Commencer à écrire "boîte à musique”Dans la barre de recherche pour trouver le cadre souhaité.


Figure 114: Recherche de la structure Audio Toolbox

Cliquez sur AudioToolbox.framework puis cliquez sur Ajouter pour l'inclure dans le projet. Nous aurons également besoin d'accéder à la AVFoundation Framework pour le AVAudioPlayer partie de ce chapitre, alors répétez le processus pour cette bibliothèque aussi. Vous devriez voir les deux AVFoundation.framework et AudioToolbox.framework dans le Résumé onglet avant de passer.


Figure 115: Toutes les bibliothèques requises pour notre exemple de projet

Nous sommes maintenant prêts à travailler avec les sons du système et AVAudioPlayer.


Sons du système

Les sons système sont conçus pour être utilisés pour des choses simples, telles que les alertes et les effets sonores de l'interface utilisateur (par exemple, les clics de bouton). Ils sont très faciles à utiliser, mais ils n’offrent pas beaucoup d’options pour contrôler la lecture. Les principales limitations de l'API de son système sont les suivantes:.

  • Les sons ne peuvent durer plus de trente secondes.
  • Vous ne pouvez pas contrôler le volume des sons du système. Ils utilisent le volume actuel de l'appareil. Un seul son peut jouer à la fois.
  • Les sons ne peuvent pas être mis en boucle ou lus après un certain délai.
  • Ils ne supportent que les fichiers .caf, .aif et .wav.
  • Il n'est pas possible de configurer comment les sons gèrent les interruptions, comme les appels entrants.

Si vous trouvez que celles-ci sont trop restrictives, vous devez utiliser AVAudioPlayer, présenté plus loin dans ce chapitre. Encore une fois, les sons du système sont destinés à des cas d'utilisation spécifiques. Si votre application utilise des sons pour plus de commentaires et d'alertes de l'interface utilisateur, vous devez probablement utiliser AVAudioPlayer.

Accéder au fichier son

Le package de ressources de ce livre contient un court fichier son appelé blip.wav. Ajoutez ceci au paquet d’applications en le faisant glisser dans la Navigateur de projet. Rappelez-vous que les sons du système utilisent une interface C, nous allons donc accéder à ce fichier en utilisant une méthode légèrement différente de celle des chapitres précédents. Dans ViewController.m, changement viewDidLoad au suivant.

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

CFBundleGetMainBundle () est essentiellement le même que [[NSBundle] mainBundle], sauf qu'il renvoie l'objet CoreFoundation qui représente l'ensemble d'applications au lieu de la version de Foundation Framework. le CoreFoundation Framework est une alternative de niveau inférieur à la Cadre de fondation. Nous devons utiliser CoreFoundation objets ici parce que c'est ce que la boîte à outils audio accepte comme arguments.

le CFBundleCopyResourceURL () est la version CoreFoundation de NSBundle pathForResource: ofType: méthode. Il renvoie simplement le chemin de la ressource demandée, et vous devriez voir un chemin de fichier familier dans le dossier. NSLog () sortie.

Une fois que vous avez un chemin d'accès au fichier son, vous devez créer un objet son à l'aide du AudioServicesCreateSystemSoundID () une fonction. Ajouter ce qui suit à viewDidLoad.

 AudioServicesCreateSystemSoundID (blipURL, & _blipOne);

Cette fonction lit le contenu du fichier son, le transforme en un objet son que l’API son du système sait lire et renvoie un ID que vous pourrez utiliser pour le référencer ultérieurement.. AudioServicesCreateSystemSoundID () est défini par le cadre Audio Toolbox, vous devez donc l’importer dans ViewController.m avant de pouvoir l'utiliser. Ajouter ce qui suit en haut du fichier.

 #importation 

Vous stockez l'ID de l'objet son dans une variable d'instance privée appelée _spot, alors ajoutez cela à la déclaration d'implémentation, aussi.

 @implementation ViewController SystemSoundID _blip;  Jouer les sons Ensuite, ajoutez par programme un bouton à la scène; ce bouton jouera le son lorsque vous cliquez dessus. UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Blip" pourState: UIControlStateNormal]; [aButton addTarget: auto action: @selector (playBlip :) pourControlEvents: UIControlEventTouchUpInside]; aButton.frame = CGRectMake (100,0, 200,0, 120,0, 40,0); [[auto view] addSubview: aButton]; Pour l'action playBlip:, nous appelons la fonction AudioServicesPlaySystemSound () pour lire le son. Il accepte un seul argument, qui doit être le SystemSoundID qui fait référence à l'objet audio souhaité (par exemple, _blip). - (void) playBlip: (id) expéditeur AudioServicesPlaySystemSound (_blip); 

Lorsque vous compilez le projet, vous devriez pouvoir cliquer sur le bouton et entendre un bref son. Assurez-vous que vos haut-parleurs ne sont pas en sourdine.


Figure 116: Un bouton de blipping

Si vous cliquez sur le bouton alors que le son est toujours en cours de lecture, vous remarquerez qu'iOS annule le son actuel et en commence un nouveau. Encore une fois, les sons système sont destinés aux effets sonores de l'interface utilisateur et à d'autres applications simples. Pour jouer plusieurs sons simultanément, vous devez passer à la version précédente. AVAudioPlayer discuté dans la section suivante.

AudioServicesCreateSystemSoundID () et AudioServicesPlaySystemSound () sont à peu près tout ce qu’il ya à sons système. Vous pouvez également trouver le AudioServicesPlayAlertSound () fonction utile. Cela fonctionne exactement comme AudioServicesPlaySystemSound (), mais cela fait vibrer le téléphone si l'utilisateur l'a activé.


AVAudioPlayer

AVFoundation Framework fournit une interface de niveau supérieur pour la gestion de la lecture audio. Pour les jeux, les lecteurs de musique personnalisés et les autres applications nécessitant des commandes audio sophistiquées, c'est le cadre que vous devez utiliser. Certaines de ses capacités incluent:

  • Aucune limite sur la durée du son.
  • Vous pouvez jouer plusieurs sons en même temps.
  • Le volume peut être contrôlé pour des sons individuels.
  • Il est possible de mettre en boucle un son ou d'effectuer d'autres actions une fois la lecture terminée..
  • Vous pouvez sauter à des points arbitraires dans le fichier son.
  • Il est facile de configurer le comportement pour gérer les interruptions via un objet délégué.

AVAudioPlayer est la classe principale que vous utiliserez à partir de la AVFoundation Cadre. Il fournit un moyen orienté objet de régler le volume, de lire le son, d'arrêter le son, de spécifier la partie du son à jouer, etc. Vous pouvez le considérer comme l’équivalent audio de UIImage / UIImageView.

Les formats de fichier pris en charge pour AVAudioPlayer sont les suivants: .m4a, .aac, .wav, .mp3, .aif, .pcm, .caf et quelques autres. Consultez le Guide de programmation multimédia d'Apple pour une discussion détaillée des formats de fichiers audio..

Accéder à la chanson

AVAudioPlayer est conçu pour être utilisé avec des fichiers son plus longs, tels que des chansons, nous avons donc distribué une mélodie appartenant au domaine public avec ce livre. Faites glisser le bonjour-chagrin d'amour.mp3 fichier du paquet de ressources dans le Navigateur de projet l'ajouter au paquet.

Puisque AVFoundation est une bibliothèque Objective-C, nous pouvons revenir à l’utilisation de NSBundle pour accéder aux ressources multimédias. Allez-y et supprimez tout viewDidLoad, et le remplacer par le suivant.

 NSURL * soundFileURL = [[NSBundle mainBundle] URLForResource: @ "good-morning-heartache" withExtension: @ "mp3"]; _player = [[AVAudioPlayer alloc] initWithContentsOfURL: erreur soundFileURL: nil];

le URLForResource: withExtension: méthode est l'équivalent NSURL de pathForResource: ofType:. C’était une meilleure option pour trouver le fichier audio car vous aviez besoin d’un objet NSURL pour initialiser le fichier. AVAudioPlayer. le initWithContentsOfURL: erreur: méthode charge le contenu du fichier son dans le AVAudioPlayer par exemple, un peu comme NSString stringWithContentsOfURL: encoding: error: méthode.

AVAudioPlayer réside dans la bibliothèque AVFoundation, assurez-vous donc d’ajouter l’instruction d’importation suivante à ViewController.h. Nous devrons y accéder ultérieurement à partir du fichier d'en-tête.

 #importation 

De plus, vous aurez besoin de quelques variables d'instance privées. Changer la déclaration d'implémentation comme suit.

 @implementation ViewController AVAudioPlayer * _player; UIButton * _playButton; UIButton * _stopButton;  Reproduction du morceau Ensuite, ajoutez un bouton de lecture à la scène: _playButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [_playButton setTitle: @ "Play" forState: UIControlStateNormal]; [_playButton addTarget: action propre: @selector (playOrPause :) pourControlEvents: UIControlEventTouchUpInside]; _playButton.frame = CGRectMake (100.0, 170.0, 120.0, 40.0); [[auto view] addSubview: _playButton]; L'action playOrPause: doit être implémentée comme suit: - (void) playOrPause: (id) expéditeur if (_player.playing) [_player pause]; [_playButton setTitle: @ "Play" forState: UIControlStateNormal];  else [_player play]; [_playButton setTitle: @ "Pause" pourState: UIControlStateNormal]; 

Ceci vérifie si la chanson est déjà en cours de lecture via De AVAudioPlayer jouer à la propriété. Si c'est le cas, le morceau est suspendu à l'aide de la méthode pause et modifie le titre du bouton en conséquence. Si ce n'est pas le cas, il commence la chanson en appelant la méthode de lecture. Vous devriez maintenant pouvoir compiler l'application et lire ou mettre en pause une chanson en appuyant sur le bouton.

Allons un peu plus loin en créant un Arrêtez bouton. Ajouter ce qui suit au viewDidLoad méthode.

 _stopButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [_stopButton setTitle: @ "Stop" pourState: UIControlStateNormal]; [_stopButton addTarget: action automatique: @selector (stop :) pourControlEvents: UIControlEventTouchUpInside]; _stopButton.frame = CGRectMake (100,0, 230,0, 120,0, 40,0); [[auto view] addSubview: _stopButton]; [/ code source] L'action correspondante appelle la méthode d'arrêt de AVAudioPlayer. Notez que cette méthode ne modifie pas la position de lecture actuelle. Elle diffère de la méthode de pause uniquement en ce qu'elle annule le préchargement effectué par la méthode de lecture. Pour revenir au début de la chanson, comme vous le souhaiteriez avec un bouton Stop typique, vous devez définir manuellement la propriété currentTime de AVAudioPlayer, comme suit:

[code source] - (void) stop: (id) expéditeur [_player stop]; _player.currentTime = 0; [_playButton setTitle: @ "Play" forState: UIControlStateNormal];

Délégués AVAudioPlayer

Un autre avantage de l'utilisation AVAudioPlayer L'API des sons système permet de gérer les interruptions à l'aide du modèle de délégué habituel. le AVAudioPlayerDelegate Le protocole définit un certain nombre de méthodes qui vous permettent de savoir quand certains événements se produisent en dehors de votre application..

Quand une interruption, comme un appel téléphonique entrant, commence, le audioPlayerBeginInterruption: La méthode est appelée sur l'objet délégué. Le son se mettra en pause automatiquement, mais cela vous donnera la possibilité d'écrire tout autre code de traitement personnalisé dont vous pourriez avoir besoin. De même, le audioPlayerEndInterruption: withOptions: La méthode est appelée lorsque l'interruption est terminée et vous pouvez utiliser le lecteur audio à nouveau. Cependant, le système ne reprend pas automatiquement la lecture. Vous devez appeler manuellement la méthode de lecture si vous voulez que cela se produise..

En plus de la gestion des interruptions, l'objet délégué vous permet également de savoir quand le son est fini. En définissant un audioPlayerDidFinishPlaying: avec succès: méthode sur l'objet délégué, vous pouvez effectuer un travail de nettoyage personnalisé. Par exemple, vous pouvez utiliser ceci pour réinitialiser le bouton de lecture et revenir au début de la chanson, comme.

 - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) lecteur correctement: (BOOL) flag [auto stop: nil]; NSLog (@ "La chanson a fini de jouer!"); 

Pour que ce code fonctionne, vous devez faire du contrôleur de vue un délégué officiel du AVAudioPlayer. Dans ViewController.h, changer la déclaration d'interface à la suivante.

 @interface ViewController: UIViewController 

Ensuite, le contrôleur de vue doit s’affecter en tant qu’objet délégué. dans le viewDidLoad méthode de ViewController.m, ajouter la ligne suivante.

 _player.delegate = self;

Maintenant, si vous laissez la chanson jouer jusqu'à la fin, le Pause bouton reviendra automatiquement dans un Jouer bouton, et en cliquant dessus va commencer la chanson depuis le début.


Figure 117: Notre lecteur de musique simple

Résumé

Dans ce chapitre, nous avons discuté de deux manières de lire de l’audio à partir d’un périphérique iOS, les sons système et AVAudioPlayer. Le premier ne doit être utilisé que pour des sons courts et simples nécessitant peu de configuration personnalisée, et le second vous permet de mieux contrôler la lecture audio..

Pour l'application iOS moyenne, le AVFoundation Framework fournit un bon équilibre entre une API conviviale et un contrôle précis de vos sons. Toutefois, gardez à l'esprit qu'iOS fournit également des fonctionnalités audio plus avancées et de bas niveau, telles que les services de file d'attente audio, ainsi qu'une API de niveau supérieur permettant d'interagir avec la bibliothèque iTunes existante de l'utilisateur via le Media Player Framework. Pour les applications spécialisées, vous pouvez même accéder à OpenAL, une bibliothèque multiplate-forme permettant de simuler un environnement audio 3D..

IOS est devenu une plate-forme multimédia facile à utiliser. Les options de gestion des images, des sons et des vidéos sont donc nombreuses à partir de votre application..


Conclusion

Ce chapitre couvrait les bases du développement d'applications iOS. Nous avons commencé par créer une interface utilisateur simple, qui nous a présenté les modèles de conception fondamentaux d’iOS: modèle-vue-contrôleur, objets délégués et action-cible. Nous nous sommes ensuite plongés dans des applications multi-scènes et avons appris comment iOS permet aux scènes de communiquer entre elles et gère automatiquement les transitions d’une scène à l’autre. Nous avons ensuite abordé le système de fichiers iOS, les ensembles d’applications et les ressources requises, telles que les icônes des applications, les images de lancement et la liste des propriétés d’information. Les bundles se sont également avérés être la méthode de localisation des applications dans plusieurs régions d’iOS. Nous avons donc été en mesure de servir des images et du texte traduits sans effort à des locuteurs de différentes langues. Enfin, nous avons brièvement examiné les capacités audio en créant un effet sonore et un lecteur de musique simples.

Bien qu'il reste encore des dizaines de frameworks à explorer par vous-même, j'espère que vous serez à l'aise avec la navigation dans un projet Xcode. En plus de l'expérience pratique, ce livre devrait vous priver d'une compréhension de haut niveau de l'architecture iOS: comment les interfaces sont créées et agencées à l'aide d'UIKit et de storyboards, et quelles classes et bibliothèques utiliser pour gérer les ressources multimédias . Fort de ces connaissances, vous devriez être plus que prêt à vous aventurer dans le monde réel du développement d'applications iOS..

Cette leçon représente un chapitre de iOS succinctement, un eBook gratuit de l'équipe de Syncfusion.