Cómo reproducir un sonido usando Swift?

Me gustaría reproducir un sonido usando Swift.

Mi código funcionaba en Swift 1.0 pero ahora ya no funciona en Swift 2 o más reciente.

override func viewDidLoad() { super.viewDidLoad() let url:NSURL = NSBundle.mainBundle().URLForResource("soundName", withExtension: "mp3")! do { player = try AVAudioPlayer(contentsOfURL: url, fileTypeHint: nil) } catch _{ return } bgMusic.numberOfLoops = 1 bgMusic.prepareToPlay() if (Data.backgroundMenuPlayed == 0){ player.play() Data.backgroundMenuPlayed = 1 } } 

Lo más preferiblemente es posible que desee utilizar AVFoundation . Proporciona todos los elementos esenciales para trabajar con medios audiovisuales.

Actualización: Compatible con Swift 2 , Swift 3 y Swift 4 como lo sugirieron algunos de ustedes en los comentarios.


Swift 2.3

 import AVFoundation var player: AVAudioPlayer? func playSound() { let url = NSBundle.mainBundle().URLForResource("soundName", withExtension: "mp3")! do { player = try AVAudioPlayer(contentsOfURL: url) guard let player = player else { return } player.prepareToPlay() player.play() } catch let error as NSError { print(error.description) } } 

Swift 3

 import AVFoundation var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) let player = try AVAudioPlayer(contentsOf: url) player.play() } catch let error { print(error.localizedDescription) } } 

Swift 4 (compatible con iOS 11)

 import AVFoundation var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/ player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) /* iOS 10 and earlier require the following line: player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */ guard let player = player else { return } player.play() } catch let error { print(error.localizedDescription) } } 

Asegúrese de cambiar el nombre de su canción y la extensión . El archivo debe importarse correctamente ( Project Build Phases > Copy Bundle Resources ). Es posible que desee colocarlo en assets.xcassets para mayor conveniencia.

Para archivos de sonido cortos, es posible que desee utilizar formatos de audio no comprimidos, como .wav ya que tienen la mejor calidad y un bajo impacto de la CPU. El mayor consumo de espacio en disco no debería ser un gran problema para archivos de sonido cortos. Cuanto más largos sean los archivos, es posible que desee ir a un formato comprimido, como .mp3 etc. pp. Compruebe los formatos de audio compatibles de CoreAudio .


Diversión: hay pequeñas bibliotecas ordenadas que hacen que los sonidos suenen aún más fáciles. 🙂
Por ejemplo: SwiftySound

Para Swift 3 :

 import AVFoundation /// **must** define instance variable outside, because .play() will deallocate AVAudioPlayer /// immediately and you won't hear a thing var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { print("url not found") return } do { /// this codes for making this app ready to takeover the device audio try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /// change fileTypeHint according to the type of your audio file (you can omit this) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) // no need for prepareToPlay because prepareToPlay is happen automatically when calling play() player!.play() } catch let error as NSError { print("error: \(error.localizedDescription)") } } 

La mejor práctica para activos locales es ponerlo dentro de assets.xcassets y cargar el archivo de esta manera:

 func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { print("url not found") return } do { /// this codes for making this app ready to takeover the device audio try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /// change fileTypeHint according to the type of your audio file (you can omit this) /// for iOS 11 onward, use : player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) /// else : /// player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) // no need for prepareToPlay because prepareToPlay is happen automatically when calling play() player!.play() } catch let error as NSError { print("error: \(error.localizedDescription)") } } 

Si el código no genera ningún error, pero no escuchas el sonido, crea el reproductor como una instancia:

  static var player: AVAudioPlayer! 

Para mí, la primera solución funcionó cuando hice este cambio 🙂

Swift 3

 import AVFoundation var myAudio: AVAudioPlayer! let path = Bundle.main.path(forResource: "example", ofType: "mp3")! let url = URL(fileURLWithPath: path) do { let sound = try AVAudioPlayer(contentsOf: url) myAudio = sound sound.play() } catch { // } //If you want to stop the sound, you should use its stop()method.if you try to stop a sound that doesn't exist your app will crash, so it's best to check that it exists. if myAudio != nil { myAudio.stop() myAudio = nil } 

iOS 12 – Xcode 10 beta 6 – Swift 4.2

Use solo 1 IBAction y apunte todos los botones a esa 1 acción.

 import AVFoundation var player = AVAudioPlayer() @IBAction func notePressed(_ sender: UIButton) { print(sender.tag) // testing button pressed tag let path = Bundle.main.path(forResource: "note\(sender.tag)", ofType : "wav")! let url = URL(fileURLWithPath : path) do { player = try AVAudioPlayer(contentsOf: url) player.play() } catch { print ("There is an issue with this code!") } } 
 func playSound(_ buttonTag : Int){ let path = Bundle.main.path(forResource: "note\(buttonTag)", ofType : "wav")! let url = URL(fileURLWithPath : path) do{ soundEffect = try AVAudioPlayer(contentsOf: url) soundEffect?.play() // to stop the spound .stop() }catch{ print ("file could not be loaded or other error!") } } 

funciona en swift 4 última versión. ButtonTag sería una etiqueta en un botón en su interfaz. Las notas están en una carpeta en una carpeta paralela a Main.storyboard. Cada nota se denomina note1, note2, etc. ButtonTag está dando el número 1, 2, etc. desde el botón presionado que se pasa como param.

Primero importe estas bibliotecas

 import AVFoundation import AudioToolbox 

establecer delegado como este

  AVAudioPlayerDelegate 

escribe este bonito código en la acción de un botón o en alguna acción:

 guard let url = Bundle.main.url(forResource: "ring", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) guard let player = player else { return } player.play() }catch let error{ print(error.localizedDescription) } 

100% trabajando en mi proyecto y probado