AVAudioPlayer没有在Swift中播放音频

问题描述 投票:8回答:9

我在我的ViewController中的一个非常简单的单一视图Swift应用程序中有这个代码:

var audioPlayer = AVAudioPlayer()

@IBAction func playMyFile(sender: AnyObject) {

    let fileString = NSBundle.mainBundle().pathForResource("audioFile", ofType: "m4a")
    let url = NSURL(fileURLWithPath: fileString)
    var error : NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    if (audioPlayer.isEqual(nil)) {
        println("There was an error: (er)")
    } else {
        audioPlayer.play()
        NSLog("working")
    }

我添加了import AVFoundationaudioPlayer是一个全局变量。当我执行代码时,它会打印“工作”,因此它会通过而没有错误但没有播放声音。该设备没有沉默。

ios cocoa-touch swift avfoundation avaudioplayer
9个回答
18
投票

你的代码有太多错误,以至于苏格拉底方法崩溃了;它可能是最简单的把它扔出去告诉你:

var player : AVAudioPlayer! = nil // will be Optional, must supply initializer

@IBAction func playMyFile(sender: AnyObject?) {
    let path = NSBundle.mainBundle().pathForResource("audioFile", ofType:"m4a")
    let fileURL = NSURL(fileURLWithPath: path)
    player = AVAudioPlayer(contentsOfURL: fileURL, error: nil)
    player.prepareToPlay()
    player.delegate = self
    player.play()
}

我没有费心去做任何错误检查,但好处是,如果出现问题,你会崩溃。

最后一点,可能相关也可能不相关:并非每个m4a文件都可以播放。例如,高度压缩的文件可能会无声地失败(双关语)。


5
投票

重要的是AvPlayer是类成员而不是在给定的函数中,否则它超出范围... :)


4
投票

这是我的快速项目中的一个工作片段。用文件名替换“audiofile”。

    var audioPlayer = AVAudioPlayer()
    let audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("audiofile", ofType: "mp3"))
    audioPlayer = AVAudioPlayer(contentsOfURL: audioPath, error: nil)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    audioPlayer.play()

您可以从这里https://github.com/bpolat/Music-Player下载功能齐全的Swift Audio Player应用程序源代码


1
投票

由于某种原因(可能是一个错误)Xcode无法播放.m4a和.mp3格式的某些音乐文件我建议将它们全部更改为.wav文件以使其播放

//top of your class
var audioPlayer = AVAudioPlayer

//where you want to play your sound
let Sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "sound", ofType: "wav")!)
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: Sound as URL)
        audioPlayer.prepareToPlay()
    } catch {
        print("Problem in getting File")
    }
    audioPlayer.play()

0
投票

var audioPlayer = AVAudioPlayer()
var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("KiepRongBuon", ofType: "mp3")!)
        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()

0
投票

我在我的应用程序中使用了以下代码,它的工作原理。希望有所帮助。

var audioPlayer: AVAudioPlayer!
if var filePath = NSBundle.mainBundle().pathForResource("audioFile", ofType:"mp3"){

     var filePathUrl = NSURL.fileURLWithPath(filePath)
     audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: nil)
     audioPlayer.play()
}else {
     println("Path for audio file not found")
}

0
投票

基于@matt答案,但有点详细'因为原始答案并没有完全满足我。

import AVFoundation

class YourController: UIViewController {

  private var player : AVAudioPlayer?

  override func viewDidLoad() {
     super.viewDidLoad()

     prepareAudioPlayer()
  }

  @IBAction func playAudio() {

      player?.play()
  }
}

extension YourController: AVAudioPlayerDelegate {}

private extension YourController {

    func prepareAudioPlayer() {

        guard let path = Bundle.main.path(forResource: "you-audio", ofType:"mp3") else {
            return
        }
        let fileURL = URL(fileURLWithPath: path)
        do {
            player = try AVAudioPlayer(contentsOf: fileURL)
        } catch let ex {
            print(ex.localizedDescription)
        }
        player?.prepareToPlay()
        player?.delegate = self
    }
}

-1
投票

在使用Try catch的Swift编码中,这个问题将为我和我的代码解决并播放音频,

var playerVal = AVAudioPlayer()

         @IBAction func btnPlayAction(sender: AnyObject) {
                let fileURL: NSURL = NSURL(string: url)!
                    let soundData = NSData(contentsOfURL: fileURL)

                    do {
                        playerVal = try AVAudioPlayer(data: soundData!)
                    }
                    catch {
                        print("Something bad happened. Try catching specific errors to narrow things down",error)
                    }

                    playerVal.delegate = self
                    playerVal.prepareToPlay()

                    playerVal.play()

              }

-1
投票

swift 3.0:

 import UIKit
    import AVFoundation

    class ViewController: UIViewController
    {
        var audioplayer = AVAudioPlayer()

        @IBAction func Play(_ sender: Any)
        {
            audioplayer.play()
        }
        @IBAction func Pause(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.pause()
            }
            else
            {

            }
        }
        @IBAction func Restart(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.currentTime = 0
                audioplayer.play()
            }
            else
            {
                audioplayer.play()
            }

        }
        override func viewDidLoad()
        {
            super.viewDidLoad()

            do
            {
                audioplayer = try AVAudioPlayer(contentsOf:URL.init(fileURLWithPath:Bundle.main.path(forResource:"bahubali", ofType: "mp3")!))
                audioplayer.prepareToPlay()

                var audioSession = AVAudioSession.sharedInstance()

                do
                {
                    try audioSession.setCategory(AVAudioSessionCategoryPlayback)
                }

                catch
                {

                }
            }
            catch
            {
                print (error)
            }

        }
     }   
© www.soinside.com 2019 - 2024. All rights reserved.