- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个类似 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/
我需要一些帮助。我正在将部分 IOS 应用程序代码从 OpenAL 转换为 AVAudioEngine,因为 OpenAL 似乎在 IOS 9 中运行不佳。我遇到以下问题。当我调用 AVAudioPl
我在使用 Java 源数据行时遇到问题。我需要演奏一个音调,所以我创建了一个仅代表音调的 Tone 类。一切工作正常,除了当我播放声音时,扬声器在声音开始时弹出。有没有什么办法解决这一问题?它用于一个
我是一名优秀的程序员,十分优秀!