用AVAudioPlayer重播音乐多重?

时间:2015-02-24 09:57:34

标签: ios swift audio avaudioplayer

我正在使用AVAudioPlayer框架,当我进入一个区域时,我选择播放一首歌(我使用的是Core Location框架,并在使用didEnterRegion函数时调用此函数)。

...
var audioPlayer = AudioPlayer()
...
func playMusic(regionIdentifier: String!){
    //Get Documents Directory
    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
    //Get region label with music file
    var musicFile = db.selectRegion(regionIdentifier)
    //If music file exists, play specified music file.
    if(musicFile != ""){
        var error:NSError?
        var musicFilePath = documentsDirectory + "/" + musicFile
        audioPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: musicFilePath), error:&error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }
    else{
        NSLog("File is not in Database.")
    }
}

首次进入某个地区时,音频播放器会播放音乐剪辑。然而,似乎当我想要重播我以前播放过的一首歌时(我正在访问我以前访问过的地区),我的歌曲不会重播。我知道函数didEnterRegion被正确调用,我试图找到第二次播放歌曲时AVAudioPlayer中是否有错误,但似乎没有产生任何错误。关于为什么我的歌曲不能再次播放的任何想法?谢谢!我也看了AVAudioPlayer won't play existing file a second time并试图将NSURL转换为NSData类型,但我仍然收到了相同的结果。

编辑:我甚至试图打印出play()函数返回true并确实返回true。

2 个答案:

答案 0 :(得分:0)

在播放之前尝试重置音频播放器:

audioPlayer.stop()
audioPlayer.currentTime = 0
audioPlayer.play()

答案 1 :(得分:0)

创建2个函数,第一个用于在audioPlayer中加载声音文件,第二个用于播放声音:

var audioPlayer = AVAudioPlayer()!

func LoadSoundFile(regionIdentifier: String!){
//Get Documents Directory
let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
//Get region label with music file
var musicFile = db.selectRegion(regionIdentifier)
//If music file exists, play specified music file.
if(musicFile != ""){
    var error:NSError?
    var musicFilePath = documentsDirectory + "/" + musicFile
    audioPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: musicFilePath), error:&error)
}
else{
    NSLog("File is not in Database.")
}
}

在playSound函数中写下:

func playSound(){
  audioPlayer.stop()
  audioPlayer.prepareToPlay()    // Not necessary
  audioPlayer.play()
}

可以通过动作(按下按钮)调用playSound函数