ExtAudioFile API 是不是曾经使用硬件来解码音频?
Posted
技术标签:
【中文标题】ExtAudioFile API 是不是曾经使用硬件来解码音频?【英文标题】:Does the ExtAudioFile API ever use hardware to decode audio?ExtAudioFile API 是否曾经使用硬件来解码音频? 【发布时间】:2014-01-23 22:51:47 【问题描述】:我正在使用ExtAudioFile
接口解码音频,想知道它是否使用过硬件辅助音频解码。
kExtAudioFileProperty_CodecManufacturer
属性的文档说:
通过指定 kAppleHardwareAudioCodecManufacturer 或 kAppleSoftwareAudioCodecManufacturer,在 ios 中使用此属性在硬件或软件编码器之间进行选择。
这似乎表明ExtAudioFile
确实可以利用解码硬件。
在其他地方,在音频格式服务文档中,我发现:
基于硬件的编解码器只能在使用音频队列服务或使用接口(如使用音频队列服务的 AV Foundation)播放或录制时使用。特别是,您不能将基于硬件的音频编解码器与 OpenAL 或在使用 I/O 音频单元时一起使用。
... 不完全清楚;如果ExtAudioFile
在其实现中使用了Audio Queue Services,那么也许它可以利用硬件,但我们实际上并不知道它是如何实现的。
我试图在运行时测试是否正在使用硬件,但这本身就很困难。音频格式服务参考中给出的一种方法是使用AudioFormatGetProperty
来测试kAudioFormatProperty_HardwareCodecCapabilities
属性。但是示例代码不起作用,总是返回kAudioFormatUnsupportedPropertyError
。 (在网上搜索后,我发现了一些其他有此问题的人的问题,但没有成功使用它的报告。)
所以...我想知道是否有人知道任何方法可以确定硬件解码器当前是否处于活动状态(在这种情况下,我可以自己测试ExtAudioFile
是否正在使用它)。或者,如果有人对ExtAudioFile
是否使用硬件有任何确切的了解(不仅仅是基于 Apple 文档中含糊的提及)。
【问题讨论】:
【参考方案1】:用ExtAudioFileSetProperty()
指定kAppleHardwareAudioCodecManufacturer
似乎会启用硬件解码,因为当已经使用该编解码器集打开了一个音频文件时,它会以kAudioConverterErr_HardwareInUse
失败,而当音频类别设置为一个时,它会以kAudioQueueErr_InvalidCodecAccess
失败不(根据文档)启用硬件解码。
但是,在使用 Instruments 进行分析后,我发现启用硬件解码后性能稍微差,我仍然无法解释......
【讨论】:
性能更差可能是因为硬件解码器针对省电而不是解码速度进行了优化。以上是关于ExtAudioFile API 是不是曾经使用硬件来解码音频?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 上使用 ExtAudioFile 进行 AAC 编码?
当 ExtAudioFile 从 AudioFile 转换时,ExtAudioFileGetProperty 失败
改造 - 是不是可以避免从应用程序拦截器调用实际 api 并返回硬编码响应?