Te voy a enseñar cómo reproducir sonidos en iOS con Swift
Alguna vez lo has pensado, lo sé.
Que al pulsar cualquier botoncillo de tu App, este reproduzca un sonido.
O quizá al cargar una vista, o al guardar un dato, no sé, el sonido es una parte importante en una App.
AVAudioPlayer
Esta es la clase que necesitamos para reproducir archivos de sonido que tengamos en nuestro proyecto.
Si queremos reproducir sonidos en iOS con Swift de cualquier tipo, y también de cualquier duración, sin duda esta es nuestra clase.
Apple recomienda esta clase entre otras cosas para:
- Reproducir sonidos de cualquier duración
- Reproducir archivo locales o en buffer de memoria
- Reproducir varios sonidos de forma simultánea, uno en cada Audio Player
AVFoundation
Para trabajar con la clase AVAudioPlayer necesitamos importar a nuestra clase el Framework AVFoundation.
import AVFoundation
Una vez importando, deberemos declarar una variable de tipo AVAudioPlayer.
var player = AVAudioPlayer ()
Implementar en un método
En este ejemplo te voy a enseñar a reproducir un sonido cuándo al pulsar un botón se ejecute un método.
Sin embargo, puedes usar este código en la finalización de cualquier algoritmo para que se reproduzca un sonido en tiempo de ejecución.
Este sería el método que deberíamos crear e implementar en nuestro controlador:
//MÉTODO QUE REPRODUCE UN SONIDO
func playSound (sender:UIButton){
//SELECCIONAMOS EL SONIDO DE NUESTRO GRUPO DE CARPETAS Y ARCHIVOS Y LO ALMACENAMOS EN UNA VARIABLE LLAMADA SOUND
var sound = NSURL (fileURLWithPath: NSBundle.mainBundle().pathForResource(«problem», ofType: «mp3»)!)
//CREAMOS UNA VARIABLE PARA GESTIONA ERRORES
var error = NSError?()
//USAMOS LA VARIABLE CREADA ANTERIORMENTE DE TIPO AVAudioPlayer Y LE PASAMOS EL ARCHIVO RECOGIDO EN LA VARIABLE SOUND
player = AVAudioPlayer (contentsOfURL: sound, error: &error)
//PREPARAMOS EL REPRODUCTOR PARA EMITIR SONIDO
player.prepareToPlay()
//REPRODUCE EL ARCHIVO
player.play()
}
Sonido activado
Es importante que sepáis que el sonido se escuchará si el usuario tiene su teléfono con sonido, si lo tiene silenciado, el sonido no se escuchará.
AudioServicesCreateSystemSoundID
Disponemos de otra forma de reproducir sonidos en iOS con Swift.
Apple recomienda usar AudioServicesCreateSystemSoundID en los siguientes casos:
- Reproducir sonidos de una duración de 30 segundos o menos
- Reproducir un único archivo de sonido
Si queremos usar esta otra opción para reproducir sonidos, deberíamos crear e implementar un método como este:
//MÉTODO QUE REPRODUCE UN SONIDO DE MENOS DE 30 SEGUNDOS
@IBAction func playSoundTwo(sender: AnyObject) {
//SELECCIONAMOS EL SONIDO DE NUESTRO PROYECTO LOCAL
var filePath = NSBundle.mainBundle().pathForResource(«sound», ofType: «caf»)
//ALMACENAMOS EL SONIDO EN UNA VARIABLE DE TIPO NSURL
var fileURL = NSURL(fileURLWithPath: filePath!)
//CREAMOS UNA VARIABLE QUE INDIQUE EL TIPO DE SONIDO
var soundID:SystemSoundID = 0
//REPRODUCIMOS EL SONIDO
AudioServicesCreateSystemSoundID(fileURL, &soundID)
AudioServicesPlaySystemSound(soundID)
}
Cómo ves, reproducir sonidos en iOS con Swift es bastante sencillo.
Puedes usar cualquiera de estas dos formas para hacerlo.
Aquí te dejo un ejemplo de lo que hemos visto, para que lo descargues y le eches un vistazo.
Y si tienes cualquier duda, déjame un comentario.
Hola Sergio da el error Built failed al compilar usando la Version 7.1.1 (7B1005) de xCode, ¿sabrías decirme por que?
Hola Ángel,
Daba error por la forma de tratar los errores que tiene Swift 2 y que no estaba en vigor cuándo realice la práctica.
Ya está corregido el ejemplo práctico, puedes descargarlo de nuevo y funcionará.
Gracias por visitar mi Blog y por comentar.
Un abrazo.
Sergio Becerril
player = AVAudioPlayer (contentsOfURL: sound, error: &error)
Da este error esa linea, poniendo todo tal y como lo tienes.
Argument labels ‘(contentsOfURL:, error:)’ do not match any available overloads
Gracias a ti, me gustaría hacer también un bucle con los sonidos ¿es posible con el AVFoundation?
Lo he conseguido hacer, ¿hay alguna forma de que se reproduzca más seguido, para que no se note el corte?
Gracias Sergio por compartir, no solo esto si no tambien tu curso online
estoy iniciando y creo que ya me estoy ambientando a este mundo
corri este tuto en mi Xcode version 7.2 y corre magnifico sin ningun error
te pregunto en esta misma estructura
¿como podria colocar un boton que haga parar al sonido?
no mute, si no pararlo
gracias por tu eseñanza
Hola Carlos,
Gracias por tus palabras.
Pues para parar el sonido lo puedes hacer así:
player.stop()
Gracias por visitar el blog y por comentar.
Un abrazo.
Sergio Becerril
Hola, he programado para reproducir un sonido cuando suceda una cosa. Pero mi sonido tiene una duración de 14 segundos, y quiero que éste se reproduzca en bucle si no deja de suceder dicha cosa. ¿me explico?
Gracias
Hola Ana,
Existe una propiedad que puedes usar para hacer loops o bucles en sonidos, es la siguiente:
player.numberOfLoops = -1;
Dónde player sería tu reproductor, y en el ejemplo superior he puesto -1 esto es un looping infinito, si pones otro número pues tu decides la cantidad de bucles a ejecutar.
Yo pondría bucle infinito y pararía el sonido al final del método que tenga que ejecutar tal cosa.
Un abrazo.
Sergio Becerril