关于C#:从多通道WAV文件读取单个通道

Reading a single channel from a multi-channel wav file

我需要从wav文件中提取单个通道的样本,该文件最多包含12个(11.1格式)通道。我知道在普通的立体声文件中,样本是交错的,首先是左,然后是右,就像这样,

1
[1st L] [1st R] [2nd L] [2nd R]...

因此,要读取左侧频道,我会这样做,

1
2
3
4
for (var i = 0; i < myByteArray.Length; i += (bitDepth / 8) * 2)
{
    // Get bytes and convert to actual samples.
}

要获得正确的频道,我只需执行for (var i = (bitDepth / 8)...

但是,具有2个以上通道的文件使用什么顺序?


Microsoft已经创建了一个涵盖多达18个渠道的标准。根据他们的意见,wav文件需要有一个特殊的meta子块(在"可扩展格式"部分下),该子块指定一个"通道掩码"(dwChannelMask)。此字段的长度为4个字节(a uint),其中包含存在的每个通道的相应位,因此指示文件中使用了18个通道中的哪个。

主频道布局

下面是MCL,即应交错现有通道的顺序以及每个通道的位值。如果不存在通道,则存在的下一个通道将"下拉"到丢失通道的位置,并且将使用其顺序号,但不会使用位值。 (无论通道是否存在,位值对于每个通道都是唯一的),

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Order | Bit | Channel

 1.     0x1  Front Left
 2.     0x2  Front Right
 3.     0x4  Front Center
 4.     0x8  Low Frequency (LFE)
 5.    0x10  Back Left (Surround Back Left)
 6.    0x20  Back Right (Surround Back Right)
 7.    0x40  Front Left of Center
 8.    0x80  Front Right of Center
 9.   0x100  Back Center
10.   0x200  Side Left (Surround Left)
11.   0x400  Side Right (Surround Right)
12.   0x800  Top Center
13.  0x1000  Top Front Left
14.  0x2000  Top Front Center
15.  0x4000  Top Front Right
16.  0x8000  Top Back Left
17. 0x10000  Top Back Center
18. 0x20000  Top Back Right

例如,如果通道掩码为0x63F(1599),则表明文件包含8个通道(FL,FR,FC,LFE,BL,BR,SL