我试图让多个声音文件在AVAudioPlayer实例上播放,但是当一种声音播放时,另一种声音停止。我一次只能播放一种以上的声音。这是我的代码:
import AVFoundation
class GSAudio{
static var instance: GSAudio!
var soundFileNameURL: NSURL = NSURL()
var soundFileName = ""
var soundPlay = AVAudioPlayer()
func playSound (soundFile: String){
GSAudio.instance = self
soundFileName = soundFile
soundFileNameURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(soundFileName, ofType: "aif", inDirectory:"Sounds")!)
do{
try soundPlay = AVAudioPlayer(contentsOfURL: soundFileNameURL)
} catch {
print("Could not play sound file!")
}
soundPlay.prepareToPlay()
soundPlay.play ()
}
}
有人可以告诉我如何一次播放多个声音文件,以帮助我吗?任何帮助深表感谢。
非常感谢,凯
音频停止的原因是因为您仅设置了一个AVAudioPlayer,所以当您要求类播放另一种声音时,当前您正在用新的AVAudioPlayer实例替换旧实例。您基本上是在覆盖它。
您可以创建GSAudio类的两个实例,然后在每个实例上调用playSound,或者使该类成为使用audioPlayers词典的通用音频管理器。
我更喜欢后一种选择,因为它可以使代码更简洁并且效率更高。您可以检查以前是否已经为声音创建了播放器,而不是例如创建新的播放器。
无论如何,我为您重新制作了您的课程,以便它可以一次播放多种声音。它也可以在自身上播放相同的声音(它不会替代声音的先前实例)希望对您有所帮助!
该类是单例,因此要访问该类,请使用:
GSAudio.sharedInstance
例如,要播放声音,您可以致电:
GSAudio.sharedInstance.playSound("AudioFileName")
并同时播放多种声音:
GSAudio.sharedInstance.playSounds("AudioFileName1", "AudioFileName2")
或者您可以将声音加载到数组中的某个位置,然后调用接受数组的playSounds函数:
let sounds = ["AudioFileName1", "AudioFileName2"]
GSAudio.sharedInstance.playSounds(sounds)
我还添加了playSounds函数,该函数可让您延迟以级联形式播放的每种声音。所以:
let soundFileNames = ["SoundFileName1", "SoundFileName2", "SoundFileName3"]
GSAudio.sharedInstance.playSounds(soundFileNames, withDelay: 1.0)
将在sound1之后播放sound2,然后sound3将在sound2之后播放秒,依此类推。
这是课程:
class GSAudio: NSObject, AVAudioPlayerDelegate {
static let sharedInstance = GSAudio()
private override init() {}
var players = [NSURL:AVAudioPlayer]()
var duplicatePlayers = [AVAudioPlayer]()
func playSound (soundFileName: String){
let soundFileNameURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(soundFileName, ofType: "aif", inDirectory:"Sounds")!)
if let player = players[soundFileNameURL] { //player for sound has been found
if player.playing == false { //player is not in use, so use that one
player.prepareToPlay()
player.play()
} else { // player is in use, create a new, duplicate, player and use that instead
let duplicatePlayer = try! AVAudioPlayer(contentsOfURL: soundFileNameURL)
//use 'try!' because we know the URL worked before.
duplicatePlayer.delegate = self
//assign delegate for duplicatePlayer so delegate can remove the duplicate once it's stopped playing
duplicatePlayers.append(duplicatePlayer)
//add duplicate to array so it doesn't get removed from memory before finishing
duplicatePlayer.prepareToPlay()
duplicatePlayer.play()
}
} else { //player has not been found, create a new player with the URL if possible
do{
let player = try AVAudioPlayer(contentsOfURL: soundFileNameURL)
players[soundFileNameURL] = player
player.prepareToPlay()
player.play()
} catch {
print("Could not play sound file!")
}
}
}
func playSounds(soundFileNames: [String]){
for soundFileName in soundFileNames {
playSound(soundFileName)
}
}
func playSounds(soundFileNames: String...){
for soundFileName in soundFileNames {
playSound(soundFileName)
}
}
func playSounds(soundFileNames: [String], withDelay: Double) { //withDelay is in seconds
for (index, soundFileName) in soundFileNames.enumerate() {
let delay = withDelay*Double(index)
let _ = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(playSoundNotification(_:)), userInfo: ["fileName":soundFileName], repeats: false)
}
}
func playSoundNotification(notification: NSNotification) {
if let soundFileName = notification.userInfo?["fileName"] as? String {
playSound(soundFileName)
}
}
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
duplicatePlayers.removeAtIndex(duplicatePlayers.indexOf(player)!)
//Remove the duplicate player once it is done
}
}
问题内容: 我正在尝试播放声音,但无法正常工作。 编辑1: 仍然行不通。 编辑2 :此代码有效。我的设备处于静音模式。 问题答案: 对您的代码进行了修改: Swift 3和Swift 4.1:
问题内容: 由于在应用程序处于活动状态时未显示该消息,因此我尝试配置an 并在出现时播放一些声音。 我在没问题,可以处理通知/创建警报。我的问题与声音有关。确实,它无法正常播放。 这是我到目前为止所拥有的: 这样,当玩家经过这条线时: 它只播放不到一秒钟。好像是突然取消分配了(?)。 我尝试了以下两件事: 将状态切换为非活动状态:在创建警报之前(或在显示警报之后)。如果这样做,声音将正确播放。但是
问题内容: 我正在开发节拍器应用程序。用户可以在运行时选择bpm,我的应用程序将相应地播放“滴答”声。“滴答”是一个节拍器“拍”(mp3)。我尝试使用Handler和MediaPlayer来实现它,但是节拍器一点也不精确。因此,我考虑了更改整个方法:当用户选择新的bpm值时,我通过每N毫秒重复X次滴答声,然后循环遍历此运行时创建的声音来合成新声音。这是有效的替代方法吗?如何在Android中实现?
问题内容: 当我尝试在小程序中同时播放两个声音时,它将不起作用。我正在使用s。甚至可以在小程序中同时播放两个声音吗? 问题答案: 从Java 1.3+开始,请使用Java Sound API 的类。它类似于基于applet的类,但更好。 EG改编自Java声音信息上显示的EG。
我为我的游戏编写了一个定制的声音系统,但如果要求在几毫秒内播放两个声音,则只能播放一个声音片段。 我尝试在这样的新线程上运行播放,但它不起作用。没有例外,它只是不会播放两种声音。 这是声音播放器类
播放(播放音效/播放录音)