gpt4 book ai didi

ios - AVAudioPlayer 噼啪声和爆裂声

转载 作者:IT王子 更新时间:2023-10-29 05:27:31 28 4
gpt4 key购买 nike

我有一个类似 Simon 的内存游戏,其中播放一系列音调,用户尝试重复这些音调。问题是我时不时会听到可怕的爆裂声。它可能只在几个音符之后,也可能多达二十个。声音都是两秒长的wav文件。我在 10 个播放器中循环播放,这样就不会剪掉任何声音。 (我尝试了多达 50 个,但没有任何帮助。)我还尝试实现 audioPlayerDidFinishPlaying,以便在声音播放完毕后我可以停止播放器,但这也无济于事。最后,我添加了 prepareToPlay() - 遗憾的是,没有区别。

一个可能相关也可能不相关的有趣问题是,在大约 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()
}
}

/******** 更新 *********/

我根据我在某个地方遇到的过时示例将 AVAudioPlayer 创建移到了它自己的类中。它解决了音频在 15 个音调后完全切断的问题,但是,裂纹和爆裂声仍然存在!我也试过重新录制声音,但没有成功。

下面是根据需要创建 AVAudioPlayer 的类:

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()

}

如果有人有任何想法 - 即使这只是下一步,您也可以尝试...

最佳答案

在我看来,您的主要问题是声音加载是在应该播放声音本身的同一个函数内完成的。从概念上讲是错误的,为了能够尽可能快地播放声音,您应该在“播放”功能之外一劳永逸地加载所有声音。该功能应该可以播放,仅此而已。

关于ios - AVAudioPlayer 噼啪声和爆裂声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47687232/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com