ios - 在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音

标签 ios swift audio avaudioplayer

我有两个 swift 文件 - 我的 ViewController:UIViewController 和 AudioPlayer:AVAudioPlayer。

我的AudioPlayer文件有这个功能

func seaGullSound() {

    var tmp = AVAudioPlayer()

    var seaGullSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Gulls", ofType: "mp3")!)

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
    AVAudioSession.sharedInstance().setActive(true, error: nil)

    var error:NSError?

    tmp = AVAudioPlayer(contentsOfURL: seaGullSound, error: &error)
    tmp.prepareToPlay()
    tmp.play()

    println("This function got called!")
}

我正在尝试使用以下代码通过点击按钮来调用 ViewController 中的该函数:

@IBAction func playSound(sender: AnyObject) {
    var audio = AudioPlayer()
    audio.seaGullSound()
}

单击按钮时没有播放声音。但是,打印语句有效。如果我将 seaGullSound() 移动到 ViewController 文件,我就可以播放音频,所以我知道 mp3 可以工作。我没有将音频移至 ViewController,因为我想养成不将所有代码都挤到一个文件中的习惯。预先感谢您的帮助。

编辑:

class HighScore: UIViewController {

var audioInitializer = AudioPlayer()

func updateHighScore(score:Int) -> String {
    NSUserDefaults.standardUserDefaults().integerForKey("highscore")

    //Check if score is higher than NSUserDefaults stored value and change NSUserDefaults stored value if it's true
    if score > NSUserDefaults.standardUserDefaults().integerForKey("highscore") {
        //call applause sound
        audioInitializer.applauseSound()
        //set score
        NSUserDefaults.standardUserDefaults().setInteger(score, forKey: "highscore")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
    NSUserDefaults.standardUserDefaults().integerForKey("highscore")

    //use below line to reset high score for testing
    //NSUserDefaults.standardUserDefaults().removeObjectForKey("highscore")

    return String(NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
}}

这是包含声音的文件:

class AudioPlayer: AVAudioPlayer {

var soundMaster = AVAudioPlayer()

func tappingSound() {

    var tapSoundURL = NSBundle.mainBundle().URLForResource("tapSound", withExtension: "mp3")

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
    AVAudioSession.sharedInstance().setActive(true, error: nil)

    var error:NSError?

    soundMaster = AVAudioPlayer(contentsOfURL: tapSoundURL, error: &error)
    soundMaster.prepareToPlay()
    soundMaster.play()
}

//need to call in highscore.swift
func applauseSound() {
    var tapSoundURL = NSBundle.mainBundle().URLForResource("applause", withExtension: "mp3")

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
    AVAudioSession.sharedInstance().setActive(true, error: nil)

    var error:NSError?

    soundMaster = AVAudioPlayer(contentsOfURL: tapSoundURL, error: &error)
    soundMaster.prepareToPlay()
    soundMaster.play()
    println("did this get called?")
}}

最佳答案

您刚刚将 tmp AVAudioPlayer 的声明移出了您的方法。将其声明为类变量。

您还应该使用 URLForResource 而不是 pathForResource:

let seaGullSoundURL = NSBundle.mainBundle().URLForResource("Gulls", withExtension:  "mp3")!

尝试这样:

import UIKit
import AVFoundation
class HighScore: UIViewController {
    var audioPlayer = AVAudioPlayer()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func updateHighScore(score:Int) -> String {
        //Check if score is higher than NSUserDefaults stored value and change NSUserDefaults stored value if it's true
        if score > NSUserDefaults().integerForKey("highscore") {
            //call applause sound
            playAudio("applause")
            //set score
            NSUserDefaults().setInteger(score, forKey: "highscore")
        }
        //use below line to reset high score for testing
        //NSUserDefaults.standardUserDefaults().removeObjectForKey("highscore")
        return NSUserDefaults().integerForKey("highscore").description
    }
    func playAudio(audioName: String ) {
        var error:NSError?
        if let audioURL = NSBundle.mainBundle().URLForResource(audioName, withExtension: "mp3") {
            audioPlayer = AVAudioPlayer(contentsOfURL: audioURL, error: &error)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        } else if let error = error {
            println(error.description)
        }
    }
    @IBAction func playSound(sender: UIButton) {
        playAudio("Gulls")
    }
}

关于ios - 在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821441/

相关文章:

javascript - Cordova 脚本未执行

audio - PIC32MX : SPI1CON. SPIBUSY 位永远不会被清除

iOS图层动画-解释

ios - 如果 _ 是 _ 或 .isKind(of : ),正确的使用方法是什么

ios - Xcode pods.framework 文件指向错误的派生数据目录

ios - UIPickerView 将数据传递给容器 View

c# - 添加了C#音效

java - 你如何比较音乐数据

iOS( swift ): Collection View indexPath(for: cell) is nil for non visible cell

ios - 有没有办法预加载 UICollectionViewCell?