首页 文章

用 AVAudioPlayer 播放声音

提问于
浏览
72

我试图用AVAudioPlayer播放声音,但它不起作用。

**编辑 1:**仍然无法正常工作。

编辑 2:此代码有效。我的设备处于静音模式。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("button-09", ofType: "wav"))
        println(alertSound)

        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }
}

8 回答

  • 2

    使用此功能在 Swift 中发出声音(您可以在此处使用此功能 sound.)

    首先添加 SpriteKit 和 AVFoundation Framework。

    import SpriteKit
    import AVFoundation
    func playEffectSound(filename: String){
         runAction(SKAction.playSoundFileNamed("\(filename)", waitForCompletion: false))
    }// use this function to play sound
    
    playEffectSound("Sound File Name With Extension")
    // Example :- playEffectSound("BS_SpiderWeb_CollectEgg_SFX.mp3")
    
  • 61

    对您的代码进行了修改:

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        var audioPlayer = AVAudioPlayer()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("button-09", ofType: "wav"))
            println(alertSound)
    
            // Removed deprecated use of AVAudioSessionDelegate protocol
            AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
            AVAudioSession.sharedInstance().setActive(true, error: nil)
    
            var error:NSError?
            audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        }
    
    }
    

    Swift 3 和 Swift 4.1:

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
        private var audioPlayer: AVAudioPlayer?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: "button-09", ofType: "wav")!)
            print(alertSound)
    
            try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try! AVAudioSession.sharedInstance().setActive(true)
    
            try! audioPlayer = AVAudioPlayer(contentsOf: alertSound)
            audioPlayer!.prepareToPlay()
            audioPlayer!.play()
        }
    }
    
  • 36

    根据 Swift 2,代码应该是

    var audioPlayer : AVAudioPlayer!
    
    func playSound(soundName: String)
    {
        let coinSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(soundName, ofType: "m4a")!)
        do{
            audioPlayer = try AVAudioPlayer(contentsOfURL:coinSound)
            audioPlayer.prepareToPlay()//there is also an async version
            audioPlayer.play()
        }catch {
            print("Error getting the audio file")
        }
    }
    
  • 23

    您的音频播放将在 viewDidLoad 完成后立即取消分配,因为您将其分配给本地变量。您需要为它创建一个属性来保持它。

  • 12

    解决方案适用于 AudioPlayer,导航栏中的 play/pause/stop 按钮为条形按钮项

    在 Swift 2.1 中,您可以使用以下代码

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        var player:AVAudioPlayer = AVAudioPlayer()
    
        override func viewDidLoad() {
                super.viewDidLoad()
    
                let audioPath = NSBundle.mainBundle().pathForResource("ARRehman", ofType: "mp3")
                var error:NSError? = nil
                do {
                    player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath!))
                }
                catch {
                    print("Something bad happened. Try catching specific errors to narrow things down")
                }
    
            }
    
        @IBAction func play(sender: UIBarButtonItem) {
            player.play()
    
        }
    
        @IBAction func stop(sender: UIBarButtonItem) {
            player.stop()
            print(player.currentTime)
            player.currentTime = 0
        }
    
        @IBAction func pause(sender: UIBarButtonItem) {
    
            player.pause()
        }
    
        @IBOutlet weak var sliderval: UISlider!
    
        @IBAction func slidermov(sender: UISlider) {
    
            player.volume = sliderval.value
            print(player.volume)
        }
    
    }
    
  • 7

    这将工作.....

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        var ding:AVAudioPlayer = AVAudioPlayer()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            prepareAudios()
            ding.play()
        }
    
        func prepareAudios() {
    
            var path = NSBundle.mainBundle().pathForResource("ding", ofType: "mp3")
            ding = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), error: nil)
            ding.prepareToPlay()
        }
    }
    
  • 3

    Swift 4.2 以后,AudioSession 类别设置选项已更改。 (尝试使用以下 Swift 4.2 代码)

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        var audioPlayer: AVAudioPlayer?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            prepareAudioSession()
        }
    
        func prepareAudioSession() -> Void {
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
                try AVAudioSession.sharedInstance().setActive(true)
    
                prepareAudioPlayer()
    
            } catch {
                print("Issue with Audio Session")
            }
        }
    
        func prepareAudioPlayer() -> Void {
    
            let audioFileName = "test"
            let audioFileExtension = "mp3"
    
            guard let filePath = Bundle.main.path(forResource: audioFileName, ofType: audioFileExtension) else {
                print("Audio file not found at specified path")
                return
            }
    
            let alertSound = URL(fileURLWithPath: filePath)
            try? audioPlayer = AVAudioPlayer(contentsOf: alertSound)
            audioPlayer?.prepareToPlay()
        }
    
        func playAudioPlayer() -> Void {
            audioPlayer?.play()
        }
    
        func pauseAudioPlayer() -> Void {
            if audioPlayer?.isPlaying ?? false {
                audioPlayer?.pause()
            }
        }
    
        func stopAudioPlayer() -> Void {
            if audioPlayer?.isPlaying ?? false {
                audioPlayer?.stop()
            }
        }
    
        func resetAudioPlayer() -> Void {
            stopAudioPlayer()
            audioPlayer?.currentTime = 0
            playAudioPlayer()
        }
    
    }
    
  • 2

    这是一个非常古老的问题,但我没有看到一个适用于 Swift 3.0 的答案,因此我对代码进行了现代化并添加了一些安全检查以防止崩溃。

    我还采取了将播放部分拉出到自己的功能中的方法,以便为遇到这个答案的任何人提供 re-use 帮助。

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
        var audioPlayer: AVAudioPlayer?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            play(for: "button-09", type: "wav")
        }
    
        func play(for resource: String, type: String) {
            // Prevent a crash in the event that the resource or type is invalid
            guard let path = Bundle.main.path(forResource: resource, ofType: type) else { return }
            // Convert path to URL for audio player
            let sound = URL(fileURLWithPath: path)
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: sound)
                audioPlayer?.prepareToPlay()
                audioPlayer?.play()
            } catch {
                // Create an assertion crash in the event that the app fails to play the sound
                assert(false, error.localizedDescription)
            }
        }
    }
    

相关问题