用 AVAudioPlayer 重放音乐多次?

Posted

技术标签:

【中文标题】用 AVAudioPlayer 重放音乐多次?【英文标题】:Replaying music multiple with AVAudioPlayer? 【发布时间】:2015-02-24 09:57:33 【问题描述】:

我正在使用 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。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

不幸的是似乎不起作用。我在播放音频播放器的正下方添加了该代码,但它似乎没有修复它。【参考方案2】:

创建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 函数可以通过一个动作(按下按钮)调用

【讨论】:

如何加载声音文件?你会直接调用 prepareToPlay() 函数吗? 我想我很困惑为什么这与我上面所说的有什么不同。另外,我想在进入特定区域时调用该函数,而不是在按下按钮时调用。

以上是关于用 AVAudioPlayer 重放音乐多次?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 上出现 AVAudioPlayer 多次播放

iPhone:MPMusicPlayerController 停止 AVAudioPlayer

Xcode:无法停止从子类播放 AVAudioPlayer 音乐

一起播放 iPod 音乐和 avaudioplayer

使用AVAudioPlayer播放音乐文件无声音

AVAudioPlayer 声音在经过这么多 IBAction 后停止播放