我是iOS的初学者,正在尝试使用Swift设计鼓组应用。我设计了一个带有单个按钮的视图,并在下面编写了代码,但是它存在一些问题:
AVAudioPlayer
OpenAL
AudioUnit
Swift
代码:
override func viewDidLoad() { super.viewDidLoad() // Enable multiple touch for the button for v in view.subviews { if v.isKindOfClass(UIButton) { v.multipleTouchEnabled = true } } // Init audio audioURL = NSBundle.mainBundle().URLForResource("snareDrum", withExtension: "wav")! do { player = try AVAudioPlayer(contentsOfURL: audioURL) player?.prepareToPlay() } catch { print("AVAudioPlayer Error") } } override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) player?.stop() player = nil } @IBAction func playSound(sender: UIButton) { player?.currentTime = 0 player?.play() }
如果您需要极低的延迟,我在AVAudioSession单例中发现了一个非常简单的解决方案(当应用启动时会自动实例化):
首先,使用此类方法获取对应用程序的AVAudioSession单例的引用:
(来自AVAudioSession类参考):
获取共享的音频会话 声明SWIFT class func sharedInstance() -> AVAudioSession
获取共享的音频会话
声明SWIFT
class func sharedInstance() -> AVAudioSession
然后,尝试使用此实例方法将首选IO缓冲区持续时间设置为非常短的时间(例如.002):
设置首选的音频I / O缓冲区持续时间(以秒为单位)。 声明SWIFT func setPreferredIOBufferDuration(_ duration: NSTimeInterval) throws 参量 duration 您要使用的音频I / O缓冲区持续时间(以秒为单位)。 outError 输入时,指向错误对象的指针。如果发生错误,则将指针设置为描述该错误的NSError对象。如果您不想要错误信息,请输入nil。返回值如果成功发出请求,则为true,否则为false。 讨论区 此方法请求更改I / O缓冲区持续时间。要确定更改是否生效,请使用IOBufferDuration属性。有关详细信息,请参阅配置音频会话。
设置首选的音频I / O缓冲区持续时间(以秒为单位)。
func setPreferredIOBufferDuration(_ duration: NSTimeInterval) throws
参量
duration 您要使用的音频I / O缓冲区持续时间(以秒为单位)。
duration
outError 输入时,指向错误对象的指针。如果发生错误,则将指针设置为描述该错误的NSError对象。如果您不想要错误信息,请输入nil。返回值如果成功发出请求,则为true,否则为false。
outError
讨论区
此方法请求更改I / O缓冲区持续时间。要确定更改是否生效,请使用IOBufferDuration属性。有关详细信息,请参阅配置音频会话。
请紧记上面的注释- IOBufferDuration属性是否 实际上 设置为传递给funcsetPrefferedIOBufferDuration(_ duration: NSTimeInterval) throws方法的值,取决于函数是否不返回错误, 并且 我还不太清楚的其他因素。另外-在我的测试中- 我发现,如果将此值设置为极低的值,则确实会设置该值(或接近它的值),但是在播放文件(例如使用AVAudioPlayerNode)时,声音不会被演奏。没有错误,只有声音。这显然是一个问题。而且,除了注意到在实际设备上进行测试时听不到声音的声音之外,我还没有发现如何测试此问题的方法。我会调查一下。但就目前而言,我建议将首选时长设置为不小于.002或.0015。.0015的值似乎适用于我正在测试的iPad Air(型号A1474)。低至.0012似乎可以在我的iPhone 6S上正常工作。
IOBufferDuration
funcsetPrefferedIOBufferDuration(_ duration: NSTimeInterval) throws
从CPU开销角度考虑的另一件事是音频文件的格式。播放时,未压缩的格式将具有非常低的CPU开销。苹果公司建议您为获得最高质量和最低开销而使用CAF文件。对于压缩文件和最低开销,您应该使用IMA4压缩:
(来自iOS多媒体编程指南):
iOS中的首选音频格式对于未压缩(最高质量)的音频,请使用打包在CAF文件中的16位,小字节序,线性PCM音频数据。您可以使用afconvert命令行工具在Mac OS X中将音频文件转换为这种格式,如下所示:
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}
当需要同时播放多个声音时,为了减少内存使用量,请使用IMA4(IMA / ADPCM)压缩。这样可以减小文件大小,但在解压缩期间对CPU的影响最小。与线性PCM数据一样,将IMA4数据打包在CAF文件中。
您也可以使用afconvert转换为IMA4:
/usr/bin/afconvert -f AIFC -d ima4 [file]