用 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