Cómo reproducir sonidos en iOS con Swift

reproducir-sonidos-en-iOS-con-Swift

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.

DESCARGAR EJEMPLO

Y si tienes cualquier duda, déjame un comentario.

About The Author
iOS Developer & Instructor at CFE Apps. Enseño a crear aplicaciones iOS a todo el que quiera aprender.

9 Comments

  • angel 15/11/2015 @ 13:11

    Hola Sergio da el error Built failed al compilar usando la Version 7.1.1 (7B1005) de xCode, ¿sabrías decirme por que?

    • Sergio Becerril 15/11/2015 @ 19:34

      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

  • angel 12/12/2015 @ 15:20

    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

  • angel 15/12/2015 @ 12:00

    Gracias a ti, me gustaría hacer también un bucle con los sonidos ¿es posible con el AVFoundation?

    • angel 15/12/2015 @ 14:16

      Lo he conseguido hacer, ¿hay alguna forma de que se reproduzca más seguido, para que no se note el corte?

  • Carlos Barco 29/12/2015 @ 20:16

    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

    • Sergio Becerril 31/12/2015 @ 12:56

      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

  • Ana 24/03/2016 @ 17:35

    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

    • Sergio Becerril 16/04/2016 @ 13:03

      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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.