나는 일련의 음색이 연주되고 사용자가 음색을 반복하려고하는 Simon-like 메모리 게임을 가지고 있습니다. 문제는 때때로 나는 끔찍한 균열을 일으켜 소리를 터뜨리는 것입니다. 단지 몇 개의 노트 나 20 개가 넘는 수 있습니다. 사운드는 길이가 2 초인 모든 wav 파일입니다. 나는 10 명의 플레이어를 거쳐서 어떤 소리도 잘리지 않도록 반복한다. (나는 50까지 시도했지만 아무것도 도움이되지 않았다.) 나는 또한 audioPlayerDidFinishPlaying
을 구현하려고 시도했기 때문에 사운드가 완성되면 플레이어를 멈출 수 있었지만 그 역시 도움이되지 못했다. 그리고 마지막으로 나는 prepareToPlay()
을 추가했습니다. 슬프게도 차이는 없습니다.AVAudioPlayer crackles and pops
약 15 개의 음표 시퀀스 후에 오디오가 모두 작동하지 않는 것이 흥미로운 문제 일 수 있습니다. 앱은 정상적으로 계속되지만 소리는 들리지 않습니다.
func playSound(_ soundID: Int) {
var soundName = ""
switch soundID {
case 0:
soundName = "beep1"
case 1:
soundName = "beep2"
case 2:
soundName = "beep3"
case 3:
soundName = "beep4"
case 4:
soundName = "swish3"
default:
soundName = "clank"
}
guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return }
do {
buttonSound.insert(try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue), at: playerIndex)
buttonSound[playerIndex].prepareToPlay()
buttonSound[playerIndex].delegate = self
if playerIndex < 10 {
buttonSound[playerIndex].play()
playerIndex += 1
} else {
buttonSound[playerIndex].play()
playerIndex = 0
}
} catch {
// error
}
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag {
player.stop()
}
}
/******** UPDATE
/
난에 AVAudioPlayer 생성 이동 ********* : 여기 코드의 오디오 부분이고 나는 예전의 예를 기반으로하는 자신의 수업을 어딘가에 가로 질렀다. 15 음색 문제가 완전히 제거 된 오디오를 해결했지만 균열과 팝이 여전히 남아 있습니다! 나는 운이없는 소리를 다시 녹음 해 보았습니다. 여기 필요에 따라 AVAudioPlayers를 만들기위한 클래스입니다 :import UIKit
import AVFoundation
private var players: [AVAudioPlayer] = []
class AVAudioPlayerPool: NSObject {
class func playerWithURL(url: URL) -> AVAudioPlayer? {
let availablePlayers = players.filter { (player) -> Bool in
return player.isPlaying == false && player.url == url
}
if let playerToUse = availablePlayers.first {
playerToUse.prepareToPlay()
return playerToUse
}
do {
let newPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
players.append(newPlayer)
newPlayer.prepareToPlay()
return newPlayer
} catch {
return nil
}
}
}
소리를 재생하는 것은 간단하다
func playSound(_ soundID: Int) {
var soundName = ""
switch soundID {
case 0:
soundName = "tt1"
case 1:
soundName = "tt2"
case 2:
soundName = "tt3"
case 3:
soundName = "tt4"
case 4:
soundName = "swish3"
default:
soundName = "clank"
}
guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return }
let player = AVAudioPlayerPool.playerWithURL(url: url)
player?.play()
}
사람이 어떤 생각을 가지고 있다면 - 그것은 단지 다음 단계는 경우에도 당신이 시도 할 수 있습니다 ...
백그라운드 대기열에서 파일을 재생하는 방법은 무엇입니까? 메인 스레드가 당신의 딱딱한 소리를 일으킬 수있는 당신의 게임을 처리하는 것으로 바쁠 수도 있습니다. – hhanesand
메인 스레드에서 움직여 보았습니다. 그러나 제안에 감사드립니다. – squarehippo10
OALSimpleAudio를 사용 하시나요? https://github.com/kstenerud/ObjectAL-for-iPhone 저는 현재 게임 프로젝트에서 사용하고 있습니다. 다른 사운드가 많이 있습니다. Objective-C 코드이지만 브리지 헤더를 사용하여 신속한 프로젝트에 추가하는 것이 간단합니다. 도움이 필요하면 알려주세요. – Woof