How to play sound using Swift?

I would like to play sound using Swift.

My code worked in Swift 1.0, but now it no longer works in Swift 2 or later.

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 } } 
+101
ios swift avfoundation
Aug 16 '15 at 14:25
source share
14 answers

Most preferably you can use AVFoundation . It provides everything you need to work with audiovisual media.

Update: compatible with Swift 2 , Swift 3, and Swift 4, as suggested by some of you in the comments.




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 with iOS 12)

 import AVFoundation var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default) 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) } } 

Be sure to change the name of your melody, as well as the extension . The file must be correctly imported ( Project Build Phases > Copy Bundle Resources ). You can place it in assets.xcassets for more convenience.

For short audio files, you can use uncompressed audio formats such as .wav because they have the best quality and low impact on the processor. Higher disk space consumption should not matter much for shorter audio files. The longer the files, the better it is to use a compressed format, such as .mp3 , etc. Check out compatible CoreAudio audio formats .




Interesting fact: there are neat little libraries that make playing sounds even easier. :)
For example: SwiftySound

+207
Aug 16 '15 at 14:41
source share

For 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)") } } 

The best practice for local assets is to place it inside assets.xcassets , and you upload the file as follows:

 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)") } } 
+39
Oct 08 '16 at 15:21
source share

iOS 12 - Xcode 10 beta 6 - Swift 4.2

Use only 1 IBAction and move all the buttons to this 1 action.

 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!") } } 
+14
Aug 26 '18 at 7:26
source share

If the code does not cause any errors, but you do not hear the sound, create the player as an instance:

  static var player: AVAudioPlayer! 

For me, the first solution worked when I made this change :)

+10
Dec 18 '17 at 18:45
source share

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 best to check that it exists. if myAudio != nil { myAudio.stop() myAudio = nil } 
+3
Mar 18 '17 at 17:33
source share

Import these libraries first

 import AVFoundation import AudioToolbox 

set delegate as follows

  AVAudioPlayerDelegate 

write this cute code for a button action or something action:

 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% works in my project and is being tested

+1
Mar 08 '18 at 7:07
source share

Swift 4 (compatible with iOS 12)

 var player: AVAudioPlayer? 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 let error { print(error.localizedDescription) } 
+1
Sep 18 '18 at 18:31
source share

Tested with Swift 4 and iOS 12:

 import UIKit import AVFoundation class ViewController: UIViewController{ var player: AVAudioPlayer! override func viewDidLoad() { super.viewDidLoad() } func playTone(number: Int) { let path = Bundle.main.path(forResource: "note\(number)", ofType : "wav")! let url = URL(fileURLWithPath : path) do { player = try AVAudioPlayer(contentsOf: url) print ("note\(number)") player.play() } catch { print (error) } } @IBAction func notePressed(_ sender: UIButton) { playTone(number: sender.tag) } } 
+1
Mar 26 '19 at 4:58
source share

very simple code for quick

add your audio file to your Xcode and give the code as indicated

 import AVFoundation class ViewController: UIViewController{ var audioPlayer = AVAudioPlayer() //declare as Globally override func viewDidLoad() { super.viewDidLoad() guard let sound = Bundle.main.path(forResource: "audiofilename", ofType: "mp3") else { print("error to get the mp3 file") return } do { audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound)) } catch { print("audio file error") } audioPlayer.play() } @IBAction func notePressed(_ sender: UIButton) { //Button action audioPlayer.stop() } 
+1
Jun 15 '19 at 6:41
source share
 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!") } } 

works in fast version 4 of the latest version. ButtonTag will be the tag on the button on your interface. Notes are located in a folder in a folder parallel to Main.storyboard. Each note is called note1, note2, etc. ButtonTag gives the number 1, 2, etc. The pressed button, which is passed as a parameter

0
Feb 14 '18 at 14:23
source share
 import UIKit import AVFoundation class ViewController: UIViewController{ var player: AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() } @IBAction func notePressed(_ sender: UIButton) { guard let url = Bundle.main.url(forResource: "note1", withExtension: "wav") else { return } do { try AVAudioSession.sharedInstance().setCategory((AVAudioSession.Category.playback), mode: .default, options: []) 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.wav.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) } } } 
0
Jan 11 '19 at 23:16
source share

Swift 4, 4.2 and 5

Play audio from URL and from your project (local file)

 import UIKit import AVFoundation class ViewController: UIViewController{ var audioPlayer : AVPlayer! override func viewDidLoad() { super.viewDidLoad() // call what ever function you want. } private func playAudioFromURL() { guard let url = URL(string: "https://geekanddummy.com/wp-content/uploads/2014/01/coin-spin-light.mp3") else { print("error to get the mp3 file") return } do { audioPlayer = try AVPlayer(url: url as URL) } catch { print("audio file error") } audioPlayer?.play() } private func playAudioFromProject() { guard let url = Bundle.main.url(forResource: "azanMakkah2016", withExtension: "mp3") else { print("error to get the mp3 file") return } do { audioPlayer = try AVPlayer(url: url) } catch { print("audio file error") } audioPlayer?.play() } } 
0
Jul 15 '19 at 9:18
source share

Play style:

Sfx.swift file

 import AVFoundation public let sfx = Sfx.shared public final class Sfx: NSObject { static let shared = Sfx() var apCheer: AVAudioPlayer? = nil private override init() { guard let s = Bundle.main.path(forResource: "cheer", ofType: "mp3") else { return print("Sfx woe") } do { apComment = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: s)) } catch { return print("Sfx woe") } } func cheer() { apCheer?.play() } func plonk() { apPlonk?.play() } func crack() { apCrack?.play() } .. etc } 

somewhere in general in code

 sfx.explosion() sfx.cheer() 
0
Sep 16 '19 at 21:24
source share
 import AVFoundation var player:AVAudioPlayer! func Play(){ guard let path = Bundle.main.path(forResource: "KurdishSong", ofType: "mp3")else{return} let soundURl = URL(fileURLWithPath: path) player = try? AVAudioPlayer(contentsOf: soundURl) player.prepareToPlay() player.play() //player.pause() //player.stop() } 
-one
Jun 10 '19 at 15:57
source share



All Articles