如果您需要极低的延迟,我在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]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)