wake-up-neo.net

Wie kann ich mit Swift einen Sound abspielen?

Ich würde gerne einen Sound mit Swift spielen.

Mein Code hat in Swift 1.0 funktioniert, aber jetzt funktioniert es nicht mehr in Swift 2 oder neuer.

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
    }
}
83
Michel

Am besten möchten Sie vielleicht AVFoundation verwenden. .__ Es enthält alle wesentlichen Elemente für die Arbeit mit audiovisuellen Medien.

Update: Kompatibel mit Swift 2, Swift 3 und Swift 4, wie von einigen von Ihnen in den Kommentaren vorgeschlagen.


Schnell 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 (kompatibel mit 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)
    }
}

Vergewissern Sie sich, dass Sie den Namen Ihres Musikstücks sowie die extension . Ändern.Die Datei muss ordnungsgemäß importiert werden (Project Build Phases> Copy Bundle Resources). Möglicherweise möchten Sie die Datei in assets.xcassets platzieren, um die Benutzerfreundlichkeit zu verbessern.

Für kurze Audiodateien möchten Sie möglicherweise nichtkomprimierte Audioformate wie .wav verwenden, da sie die beste Qualität und eine geringe CPU-Belastung haben. Der höhere Speicherplatzbedarf sollte für kurze Audiodateien keine große Rolle spielen. Je länger die Dateien sind, sollten Sie ein komprimiertes Format wie .mp3 usw. wählen. Überprüfen Sie die kompatiblen Audioformate von CoreAudio.


Fun-fact: Es gibt nette kleine Bibliotheken, die das Abspielen von Sounds noch einfacher machen. :) 
Zum Beispiel: SwiftySound

175
Devapploper

Für 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)")
    }
}

Die beste Vorgehensweise für lokale Assets ist, sie in assets.xcassets einzufügen und die Datei folgendermaßen zu laden:

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)")
    }
}
37
Adi Nugroho

iOS 12 - Xcode 10 Beta 6 - Swift 4.2

Verwenden Sie nur 1 IBAction und weisen Sie alle Tasten auf diese 1 Aktion.

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!")

        }

}
11
Tony Ward

Wenn Code keinen Fehler generiert, Sie jedoch keinen Ton hören, erstellen Sie den Player als Instanz:

   static var player: AVAudioPlayer!

Für mich funktionierte die erste Lösung, als ich diese Änderung durchführte :)

4
EranKT

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
}
3
Mr.Shin

Swift 4 (kompatibel mit 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)
    }
2
imdpk

sehr einfacher Code für Swift

fügen Sie Ihre Audiodatei zu Ihrem Xcode hinzu und geben Sie den Code wie angegeben ein

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
M VIJAY

Getestet mit Swift 4 und 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
Ershin Bot

Swift 4, 4.2 und 5

Audio von URL und von Ihrem Projekt (lokale Datei) abspielen

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
Akbar Khan

Importieren Sie zuerst diese Bibliotheken

import AVFoundation

import AudioToolbox    

stellvertreter so einstellen 

   AVAudioPlayerDelegate

schreibe diesen hübschen Code auf die Schaltfläche Aktion oder etwas Aktion:

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% in meinem Projekt arbeiten und getestet

0
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!")
    }
}

arbeitet in der neuesten Version von Swift 4. ButtonTag wäre ein Tag auf einer Schaltfläche Ihrer Benutzeroberfläche. Notizen befinden sich in einem Ordner in einem Ordner parallel zu Main.storyboard. Jede Notiz wird als note1, note2 usw. bezeichnet. ButtonTag gibt die Nummer 1, 2 usw. des angeklickten Buttons an, der als param übergeben wird

0
Egi Messito
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
Hunter Akers