AVAudioChannelLayout
描述了特定的频道布局。 channelCount
属性给出通道数。但我发现没有方便的方法来获取有关每个通道的更多信息,如名称和角度位置。 AVFAudio
或某些第三方库中是否有一种方法可用于查询有关每个特定频道的信息?
我发现
AVFAudio
给我关于每个频道的任何信息的唯一方法是通过其布局名称。我会得到这样的名字。它会输出像"5.1 (C L R Ls Rs LFE)"
这样的东西
extension AVAudioChannelLayout {
func getLayoutName() -> String {
var cfString: CFString! = nil
var propertySize: UInt32 = UInt32(MemoryLayout<CFString>.size)
var rawLayout: AudioChannelLayout = layout.pointee
AudioFormatGetProperty(kAudioFormatProperty_ChannelLayoutName,
UInt32(MemoryLayout<AudioChannelLayout>.size),
&rawLayout, &propertySize, &cfString)
return String(cfString as NSString)
}
然后我会解析字符串,并将每个频道名称查找到它的属性。问题是对于每个位置的每个通道的调用没有统一的规范。同一位置的通道在不同的布局下称为不同的东西。更糟糕的是,一些名称相同的通道在不同的布局中处于不同的位置。 (来源:https://mediaarea.net/AudioChannelLayout)
这种字符串解析方法看起来真的很卡顿和不可靠。真的没有更好的方法吗?
编辑: 我知道频道描述可以存在于
AVAudioChannelLayout
中。但这仅适用于 AVFAudio
无法将其缩减为通道位集或标签的情况。我想另一种表达问题的方式是“如何强制AVFAudio
始终填写mChannelDescriptions
的AudioChannelLayout
。