7

我需要帮助理解以下 ASBD。它是分配给新实例的默认 ASBD RemoteIO(我通过AudioUnitGetProperty(..., kAudioUnitProperty_StreamFormat, ...)RemoteIO音频单元上执行得到它,就在分配和初始化它之后)。

Float64 mSampleRate        44100
UInt32  mFormatID          1819304813
UInt32  mFormatFlags       41
UInt32  mBytesPerPacket    4
UInt32  mFramesPerPacket   1
UInt32  mBytesPerFrame     4
UInt32  mChannelsPerFrame  2
UInt32  mBitsPerChannel    32
UInt32  mReserved          0

问题是,不mBytesPerFrame应该8吗?如果我每个通道有 32 位(4 个字节),每帧有 2 个通道,那么每个帧不应该是 8 个字节长(而不是 4 个)吗?

提前致谢。

4

2 回答 2

5

的值mBytesPerFrame取决于mFormatFlags。来自 CoreAudioTypes.h:

Typically, when an ASBD is being used, the fields describe the complete layout
of the sample data in the buffers that are represented by this description -
where typically those buffers are represented by an AudioBuffer that is
contained in an AudioBufferList.

However, when an ASBD has the kAudioFormatFlagIsNonInterleaved flag, the
AudioBufferList has a different structure and semantic. In this case, the ASBD
fields will describe the format of ONE of the AudioBuffers that are contained in
the list, AND each AudioBuffer in the list is determined to have a single (mono)
channel of audio data. Then, the ASBD's mChannelsPerFrame will indicate the
total number of AudioBuffers that are contained within the AudioBufferList -
where each buffer contains one channel. This is used primarily with the
AudioUnit (and AudioConverter) representation of this list - and won't be found
in the AudioHardware usage of this structure.
于 2012-09-07T23:37:27.673 回答
0

我相信,因为格式标志指定kAudioFormatFlagIsNonInterleaved它遵循任何缓冲区中帧的大小只能是 1 通道帧的大小。如果这是正确mChannelsPerFrame的,那肯定是一个令人困惑的名字。

我希望其他人能确认/澄清这一点。

于 2012-09-03T21:29:55.113 回答