iOS ofrece varias opciones para trabajar con audio. En este capítulo, presentaremos dos marcos para tratar diferentes tipos de sonidos. Audio Toolbox Framework incluye una biblioteca de C para reproducir sonidos simples del sistema, y AVFoundation Framework proporciona una interfaz orientada a objetos para la reproducción y grabación de nivel intermedio.
Para ambos marcos, interactuar con archivos de audio es conceptualmente lo mismo que interactuar con imágenes. Aún usa NSBundle para ubicar el archivo en el disco y luego carga su contenido con otra clase dedicada a interpretar los diferentes formatos de audio.
La API de sonido del sistema se define en el marco de Audio Toolbox. Todo el marco está escrito en C en lugar de en Objective-C, por lo que trabajaremos con la interfaz C en una aplicación iOS para la primera mitad de este capítulo. Esto cambia la forma en que interactuaremos con los objetos principales de iOS, pero no dejes que eso te asuste. Todavía estamos tratando con los mismos objetos y conceptos que hemos visto a lo largo de todo este libro. Por ejemplo, en lugar de usar el mainBundle método de NSBundle, vamos a utilizar una función C llamada CFBundleGetMainBundle () para acceder al paquete de aplicaciones.
Como en el capítulo anterior, todo lo que vamos a necesitar es un simple Solicitud de vista única. Crea un nuevo proyecto y llámalo. Audio. Como es habitual, usar edu.self Para el Identificación de compañía y iPhone para dispositivos, y asegúrese de que tanto el Utilizar guiones gráficos y Utilice el conteo automático de referencias las casillas de verificación están seleccionadas.
A diferencia del capítulo anterior, necesitamos acceder a dos marcos de audio, que no están incluidos en la plantilla. Para agregar un nuevo marco al proyecto, haga clic en el icono del proyecto en la Navegador de proyectos y seleccione el Audio objetivo. En el Resumen pestaña, desplácese hacia abajo hasta la Marcos vinculados y bibliotecas sección.
Estas son las bibliotecas de códigos a las que tiene acceso desde el código de la aplicación. Necesitas añadir el Marco de herramientas de audio para trabajar con los sonidos del sistema, haga clic en el signo más en la esquina inferior izquierda. El cuadro de diálogo resultante contiene una lista de todos los marcos y bibliotecas disponibles. Comience a escribir "audiotoolbox”En la barra de búsqueda para encontrar nuestro marco deseado.
Hacer clic AudioToolbox.framework y luego haga clic Añadir Incluirlo en el proyecto. También necesitaremos acceso a la Marco de AVFundacion Para el AVAudioPlayer parte de este capítulo, así que repita el proceso para esta biblioteca, también. Deberías ver ambos AVFoundation.framework y AudioToolbox.framework en el Resumen pestaña antes de continuar.
Ahora estamos listos para comenzar a trabajar con los sonidos del sistema y AVAudioPlayer.
Los sonidos del sistema están diseñados para ser utilizados para cosas simples como alertas y efectos de sonido de IU (por ejemplo, clics de botones). Son muy fáciles de usar, pero la compensación es que no ofrecen muchas opciones para controlar la reproducción. Las principales limitaciones de la API de sonido del sistema son las siguientes.
Si encuentra que estos son demasiado restrictivos, debe usar el AVAudioPlayer que se describe más adelante en este capítulo. Una vez más, los sonidos del sistema están diseñados para casos de uso específicos. Si su aplicación usa sonidos para más que retroalimentación y alertas de UI, probablemente debería usar AVAudioPlayer.
El paquete de recursos para este libro contiene un archivo de sonido corto llamado blip.wav. Agregue esto al paquete de aplicaciones arrastrándolo a la Navegador de proyectos. Recuerde que los sonidos del sistema utilizan una interfaz C, por lo que accederemos a este archivo utilizando un método ligeramente diferente al de los capítulos anteriores. En ViewController.m, cambio viewDidLoad a lo siguiente.
- (void) viewDidLoad [super viewDidLoad]; CFURLRef blipURL = CFBundleCopyResourceURL (CFBundleGetMainBundle (), CFSTR ("blip"), CFSTR ("wav"), NULL); NSLog (@ "% @", blipURL);
CFBundleGetMainBundle () es esencialmente lo mismo que [[NSBundle] mainBundle], excepto que devuelve el objeto CoreFoundation que representa el paquete de la aplicación en lugar de la versión de Foundation Framework. los CoreFoundation El marco es una alternativa de nivel inferior a la Marco de la fundación. Necesitamos usar CoreFoundation Objetos aquí porque eso es lo que Audio Toolbox acepta como argumentos..
los CFBundleCopyResourceURL () es la versión CoreFoundation de NSBundle pathForResource: ofType: método. Simplemente devuelve la ruta al recurso solicitado, y debería ver una ruta de archivo familiar en el NSLog () salida.
Una vez que tenga una ruta de acceso al archivo de sonido, debe crear un objeto de sonido utilizando la AudioServicesCreateSystemSoundID () función. Agregue lo siguiente a viewDidLoad.
AudioServicesCreateSystemSoundID (blipURL, & _blipOne);
Esta función lee el contenido del archivo de sonido, lo convierte en un objeto de sonido que la API de sonido del sistema sabe cómo reproducir, y devuelve una identificación que puede usar para hacer referencia a ella más adelante.. AudioServicesCreateSystemSoundID () está definido por Audio Toolbox Framework, por lo que necesita importarlo en ViewController.m antes de que puedas usarlo. Agrega lo siguiente a la parte superior del archivo.
#importar
Estás almacenando el ID del objeto de sonido en una variable de instancia privada llamada _punto luminoso en un radar, así que agregue eso a la declaración de implementación, también.
@implementation ViewController SystemSoundID _blip; Reproduciendo los sonidos a continuación, agregue programáticamente un botón a la escena; ese botón reproducirá el sonido cuando se haga clic. UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Blip" forState: UIControlStateNormal]; [aButton addTarget: self action: @selector (playBlip :) forControlEvents: UIControlEventTouchUpInside]; aButton.frame = CGRectMake (100.0, 200.0, 120.0, 40.0); [[vista propia] addSubview: aButton]; Para la acción playBlip: llamaremos a la función AudioServicesPlaySystemSound () para reproducir el sonido. Acepta un solo argumento, que debe ser el SystemSoundID que se refiere al objeto de sonido deseado (por ejemplo, _blip). - (void) playBlip: (id) sender AudioServicesPlaySystemSound (_blip);
Cuando compile el proyecto, debería poder hacer clic en el botón y escuchar un sonido breve. Asegúrese de que sus altavoces no estén silenciados.
Si hace clic en el botón mientras el sonido aún se está reproduciendo, notará que iOS cancela el sonido actual y comienza uno nuevo. Nuevamente, los sonidos del sistema están diseñados para efectos de sonido de IU y otras aplicaciones sencillas. Para reproducir varios sonidos simultáneamente, deberás actualizar a la AVAudioPlayer discutido en la siguiente sección.
AudioServicesCreateSystemSoundID () y AudioServicesPlaySystemSound () Son prácticamente todo lo que hay para los sonidos del sistema. También puede encontrar el AudioServicesPlayAlertSound () Función útil. Funciona exactamente igual que AudioServicesPlaySystemSound (), pero hace que el teléfono vibre si el usuario lo tiene habilitado.
AVFoundation Framework proporciona una interfaz de nivel superior para administrar la reproducción de audio. Para juegos, reproductores de música personalizados y otras aplicaciones que requieren controles de audio sofisticados, este es el marco que debe usar. Algunas de sus capacidades incluyen:
AVAudioPlayer es la clase principal que utilizará de la Fundación Marco de referencia. Proporciona una forma orientada a los objetos para configurar el volumen, reproducir el sonido, detener el sonido, especificar qué parte del sonido se reproducirá, etc. Puedes considerarlo como el equivalente de audio de UIImage / UIImageView.
Los formatos de archivo admitidos para AVAudioPlayer incluyen .m4a, .aac, .wav, .mp3, .aif, .pcm, .caf y algunos otros. Consulte la Guía de programación multimedia de Apple para una discusión detallada de los formatos de archivos de audio..
AVAudioPlayer está diseñado para usarse con archivos de sonido más largos, como canciones, por lo que hemos distribuido una melodía de Billie Holiday de dominio público con este libro. Arrastrar el buenos días-heartache.mp3 archivo del paquete de recursos en el Navegador de proyectos para agregarlo al paquete.
Ya que Fundación es una biblioteca de Objective-C, podemos volver a usar NSBundle para acceder a los recursos de medios. Sigue adelante y elimina todo en viewDidLoad, y reemplazarlo con el siguiente.
NSURL * soundFileURL = [[NSBundle mainBundle] URLForResource: @ "good-morning-heartache" withExtension: @ "mp3"]; _player = [[AVAudioPlayer alloc] initWithContentsOfURL: error SoundFileURL: nil];
los URLForResource: withExtension: método es el NSURL equivalente a pathForResource: ofType:. Esta fue una mejor opción para encontrar el archivo de audio, ya que necesitaba un objeto NSURL para inicializar AVAudioPlayer. los initWithContentsOfURL: error: método carga el contenido del archivo de sonido en el AVAudioPlayer ejemplo, al igual que NSString stringWithContentsOfURL: encoding: error: método.
AVAudioPlayer reside en la biblioteca AVFoundation, así que asegúrese de agregar la siguiente declaración de importación a ViewController.h. Tendremos que acceder desde el archivo de cabecera más adelante..
#importar
Además, necesitarás unas pocas variables de instancia privadas. Cambie la declaración de implementación a la siguiente.
@implementation ViewController AVAudioPlayer * _player; UIButton * _playButton; UIButton * _stopButton; Reproducción de la canción A continuación, agregue un botón Reproducir a la escena: _playButton = [botón UIButtonWithType: UIButtonTypeRoundedRect]; [_playButton setTitle: @ "Play" forState: UIControlStateNormal]; [_playButton addTarget: self action: @selector (playOrPause :) forControlEvents: UIControlEventTouchUpInside]; _playButton.frame = CGRectMake (100.0, 170.0, 120.0, 40.0); [[vista propia] addSubview: _playButton]; La acción playOrPause: debería implementarse así: - (void) playOrPause: (id) sender if (_player.playing) [_player pause]; [_playButton setTitle: @ "Play" forState: UIControlStateNormal]; else [_player play]; [_playButton setTitle: @ "Pausa" para Estado: UIControlStateNormal];
Esto comprueba si la canción ya se está reproduciendo a través de AVAudioPlayer jugando a la propiedad. Si es así, detiene la canción usando el método de pausa y cambia el título del botón en consecuencia. Si no es así, comienza la canción llamando al método de reproducción. Ahora debería poder compilar la aplicación y reproducir o pausar una canción tocando el botón.
Vayamos un paso más allá creando un Detener botón. Agregue lo siguiente a la viewDidLoad método.
_stopButton = [botón UIButtonWithType: UIButtonTypeRoundedRect]; [_stopButton setTitle: @ "Stop" forState: UIControlStateNormal]; [_stopButton addTarget: self action: @selector (stop :) forControlEvents: UIControlEventTouchUpInside]; _stopButton.frame = CGRectMake (100.0, 230.0, 120.0, 40.0); [[vista propia] addSubview: _stopButton]; [/ sourcecode] La acción correspondiente llama al método de detención de AVAudioPlayer. Tenga en cuenta que este método no cambia la posición de reproducción actual; se diferencia del método de pausa solo en que deshace la precarga realizada por el método de reproducción. Para saltar al principio de la canción como cabría esperar de un típico botón Detener, debe configurar manualmente la propiedad currentTime de AVAudioPlayer, de esta manera: [código fuente] - (void) stop: (id) sender [_player stop]; _player.currentTime = 0; [_playButton setTitle: @ "Play" forState: UIControlStateNormal];
Otra ventaja de usar AVAudioPlayer sobre la API de sonidos del sistema es que le permite manejar las interrupciones utilizando el patrón de delegado familiar. los AVAudioPlayerDelegate el protocolo define una serie de métodos que le permiten saber cuándo ocurren ciertos eventos fuera de su aplicación.
Cuando comienza una interrupción como una llamada entrante, el audioPlayerBeginInterruption: El método se llama en el objeto delegado. El sonido se detendrá automáticamente, pero esto le da la oportunidad de escribir cualquier otro código de manejo personalizado que pueda necesitar. Del mismo modo, el audioPlayerEndInterruption: withOptions: Se llama al método cuando finaliza la interrupción y puede usar el reproductor de audio nuevamente. Sin embargo, el sistema no reanuda automáticamente la reproducción. Necesitas llamar manualmente el método de juego si quieres que esto suceda.
Además del manejo de interrupciones, el objeto delegado también le permite saber cuándo el sonido ha terminado de reproducirse. Definiendo un audioPlayerDidFinishPlaying: correctamente: método en el objeto delegado, puede hacer un trabajo de limpieza personalizado. Por ejemplo, puede usar esto para restablecer el botón de reproducción y saltar al principio de la canción, como así.
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) reproductor correctamente: (BOOL) marca [self stop: nil]; NSLog (@ "¡La canción terminó de reproducirse!");
Para que este código funcione, debe hacer que el controlador de vista sea un delegado formal para el AVAudioPlayer. En ViewController.h, cambiar la declaración de interfaz a la siguiente.
@interface ViewController: UIViewController
Luego, el controlador de vista necesita asignarse como el objeto delegado. En el viewDidLoad método de ViewController.m, agrega la siguiente linea.
_player.delegate = self;
Ahora, si dejas que la canción se reproduzca hasta el final, el Pausa botón se convertirá automáticamente en una Jugar botón, y al hacer clic en él comenzará la canción desde el principio.
En este capítulo, discutimos dos formas de reproducir audio desde un dispositivo iOS, los sonidos del sistema y AVAudioPlayer. El primero debe usarse solo para sonidos cortos y simples que no necesitan mucha configuración personalizada, y el segundo le brinda más control sobre la reproducción de audio.
Para la aplicación promedio de iOS, la Marco de AVFundacion proporciona un buen equilibrio entre una API fácil de usar y un control detallado sobre sus sonidos. Sin embargo, tenga en cuenta que iOS también ofrece capacidades de audio más avanzadas y de bajo nivel, como los Servicios de colas de audio, así como una API de nivel superior para interactuar con la biblioteca de iTunes existente del usuario a través de Media Player Framework. Para aplicaciones especializadas, incluso puede desplegar en OpenAL, que es una biblioteca multiplataforma para simular un entorno de audio en 3D..
Se ha trabajado mucho para hacer de iOS una plataforma compatible con multimedia, por lo que no hay escasez de opciones para administrar imágenes, sonidos y videos desde su aplicación..
Este capítulo cubrió los conceptos básicos del desarrollo de aplicaciones iOS. Comenzamos por construir una interfaz de usuario simple, que nos introdujo en los patrones de diseño fundamentales de iOS: modelo-vista-controlador, objetos delegados y acción objetivo. Luego nos sumergimos en aplicaciones de múltiples escenas y aprendimos cómo iOS permite que las escenas se comuniquen entre sí y maneja automáticamente las transiciones de una escena a otra. Después de eso, analizamos el sistema de archivos iOS, los paquetes de aplicaciones y los recursos necesarios, como los íconos de aplicaciones, las imágenes de inicio y la lista de propiedades de información. Los paquetes también fueron el método para localizar aplicaciones en varias regiones en iOS, por lo que pudimos servir imágenes traducidas y texto sin esfuerzo para hablantes de diferentes idiomas. Finalmente, echamos un vistazo a las capacidades de audio creando un simple efecto de sonido de UI y un reproductor de música..
Si bien aún te quedan docenas de marcos para explorar por tu cuenta, espero que te sientas cómodo navegando en un proyecto de Xcode. Junto con alguna experiencia práctica, lo que debe sacar de este libro es un alto nivel de comprensión de la arquitectura de iOS: cómo se crean y diseñan las interfaces con UIKit y guiones gráficos, y qué clases y bibliotecas deben usar para administrar los activos de medios. . Con este conocimiento, debería estar más que preparado para aventurarse en el mundo real del desarrollo de aplicaciones iOS..
Esta lección representa un capítulo de iOS sucintamente, un libro electrónico gratuito del equipo en Syncfusion.