一尘不染

在iOS Swift中进行简单的低延迟音频播放

swift

我是iOS的初学者,正在尝试使用Swift设计鼓组应用。我设计了一个带有单个按钮的视图,并在下面编写了代码,但是它存在一些问题:

  1. 当我像鼓声一样快速触摸按钮时,会丢失一些声音。
  2. 仍然在“鼓声滚动”中,每次触摸该按钮都会中断声音,而不是让样本播放到结束为止。例如,c滚动太糟糕了。即使我再次触摸该按钮,我也希望听到所有采样的声音。
  3. 触摸和声音之间存在延迟。我知道这AVAudioPlayer是不是低延迟音频的最佳选择,但作为一个初学者,它很难学OpenALAudioUnit没有代码示例或教程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()
}

阅读 254

收藏
2020-07-07

共1个答案

一尘不染

如果您需要极低的延迟,我在AVAudioSession单例中发现了一个非常简单的解决方案(当应用启动时会自动实例化):

首先,使用此类方法获取对应用程序的AVAudioSession单例的引用:

(来自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属性。有关详细信息,请参阅配置音频会话


请紧记上面的注释- IOBufferDuration属性是否 实际上 设置为传递给funcsetPrefferedIOBufferDuration(_ duration: NSTimeInterval) throws方法的值,取决于函数是否不返回错误, 并且 我还不太清楚的其他因素。另外-在我的测试中-
我发现,如果将此值设置为极低的值,则确实会设置该值(或接近它的值),但是在播放文件(例如使用AVAudioPlayerNode)时,声音不会被演奏。没有错误,只有声音。这显然是一个问题。而且,除了注意到在实际设备上进行测试时听不到声音的声音之外,我还没有发现如何测试此问题的方法。我会调查一下。但就目前而言,我建议将首选时长设置为不小于.002或.0015。.0015的值似乎适用于我正在测试的iPad
Air(型号A1474)。低至.0012似乎可以在我的iPhone 6S上正常工作。

从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]

2020-07-07