我的AudioPlayer无法正常工作。无法理解这一点

时间:2015-02-01 00:19:34

标签: ios iphone swift

我的audioPlayer无法使用。我似乎无法理解为什么。我是一个新手,对swift没有多少经验。当我运行时,我收到println(“audioPlayer not created”)消息。 FilePath,FilePathUrl和mp3已经确认并且有效。

导入UIKit 导入AVFoundation

class PlaySoundsViewController:UIViewController {

var audioPlayer:AVAudioPlayer!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    if let filePath = NSBundle.mainBundle().pathForResource("crankringtone", ofType: "mp3"){
        var filePathUrl = NSURL.fileURLWithPath(filePath)

        audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: nil)
    } else {
        println("file path is empty")
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func playSlowAudio(sender: UIButton) {
    // here you can check if the player was successfully created
    if var audioPlayer = audioPlayer {
        // here you can check if your player is playing
        if audioPlayer.playing {
            //if playing lets pause it
            audioPlayer.pause()
        } else {
            //if plaused lets play it
            audioPlayer.play()
        }

    } else {
        println("audioPlayer not created")
    }
}

3 个答案:

答案 0 :(得分:0)

  

我似乎无法理解为什么。

然后编写有助于您理解的代码。您的代码是检查错误和忽略错误的奇怪组合。看看这两行:

var filePathUrl = NSURL.fileURLWithPath(filePath)
audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: nil)

这些行中的第一行可能会失败 - 你可以得到零。这些行中的第二行可能会失败 - 您可能会收到错误,如果您将NSErrorPointer作为第二个参数传递,则会报告给您。然而,你忽略了所有这一切而没有检查错误。

所以你的音频播放器没有被创建,你没有注意到,因为你没有检查错误。

您的代码的另一个奇怪之处在于您执行了pathForResource,然后尝试将其转换为URL。那个坚果。如果您想要一个网址(而且确实如此),为什么不开始使用URLforResource

所以基本上这里的问题是你的代码结构容易出错并且对这些错误不透明。编写探索的代码,以便您知道正在发生的事情。或者只需使用调试器并逐步执行代码,随时检查变量。您很快就会明白问题所在。

答案 1 :(得分:0)

1)@Matt解释了为什么你没有正确初始化。您可以通过在该行上放置断点并在右侧的audioPlayer上方来检查您是否没有audioPlayer的实例。如果没有实例,则会说nil,并且没有播放器可以播放该歌曲。

if var audioPlayer = audioPlayer

2)您不应声明与实例变量同名的局部变量。后来编译器应该怎么知道你的意思?

3)你的条件在逻辑上是错误的。你正在检查你是否分配了某些东西。不要混淆赋值=和比较==

4)你必须调用audioplayer.prepareToPlay()然后你必须调用audioPlayer.play()来播放一些东西。第一个重新填充音频缓冲区的时间。第二是播放内容。我在任何地方都没有看到任何这些方法。

答案 2 :(得分:0)

您只需将var声明更改为:

var audioPlayer:AVAudioPlayer? = nil

然后在那里使用

if let audioPlayer = audioPlayer {...}

您的最终代码应如下所示:

import UIKit
import AVFoundation

class ViewController: UIViewController {
    @IBOutlet weak var playPause: UIButton!

    var audioPlayer:AVAudioPlayer? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        if let fileUrl = NSBundle.mainBundle().URLForResource("crankringtone", withExtension:"mp3") {
            audioPlayer = AVAudioPlayer(contentsOfURL: fileUrl, error: nil)
        } else {
            println("could not find bundle file")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func playAudio(sender: UIButton) {
        // here you can check if the player was successfully created
        if let audioPlayer = audioPlayer {
            // here you can check if your player is playing
            if audioPlayer.playing {
                //if playing lets pause it
                playPause.setTitle("Play", forState: UIControlState.Normal)
                audioPlayer.pause()
            } else {
                //if plaused lets play it
                playPause.setTitle("Pause", forState: UIControlState.Normal)
                audioPlayer.play()
            }
        } else {
            println("audioPlayer not created")
        }
    }
}