多声道音频数据和 WAVE 文件更新日期: 3月 7日 2007年 本文将介绍使用 WAVE 文件格式存储和传输多声道音频数据的标准。读者应该了解多媒体文件格式,尤其是音频文件格式。 文本还将介绍创作多声道音频流的方法,多声道音频流要求明确地定义声道/扬声器位置。可以使用以上任何格式表示高分辨率流中精度的位数。 本页内容 简介 简介PC 已经成为当今应用程序的最佳多媒体平台。CD 质量的音频(立体声、16 位、44.1 kHz)通常是指 PC 平台上可以达到的最高音频质量。随着工业的向前发展,将不断创作超越目前定义标准的新内容,包括更高的采样率、更高的位深、多声道(好于立体声)音频流和播放系统。为了与新数据格式和传递机制并驾齐驱,必须创建一个标准来确保应用程序和硬件之间的统一性。 Microsoft 已经扩展了传统的单声道或立体声,以及 8 位或 16 位的格式。实现方式是将WAVE_FORMAT_PCM和WAVE_FORMAT_IEEE_FLOAT建立在一个名为WAVEFORMATEXTENSIBLE的结构的基础上。实际上,可以通过使用WAVEFORMATEXTENSIBLE,采用相同的方法来扩展任何当前注册的格式标记。使用 ksmedia.h 中定义的宏DEFINE_WAVEFORMATEX_GUID(x)为现有格式标记WAVEFORMATEXTENSIBLE的 SubFormat 字段创建 GUID(全局唯一标识符)。某些常用的 GUID 具有静态名称,可以用来替换宏。这些名称包括KSDATAFORMAT_SUBTYPE_PCM、KSDATAFORMAT_SUBTYPE_IEEE_FLOAT、KSDATAFORMAT_SUBTYPE_ALAW、KSDATAFORMAT_SUBTYPE_MULAW、KSDATAFORMAT_SUBTYPE_ADPCM和KSDATAFORMAT_SUBTYPE_MPEG。 没有注册格式标记的新格式只需为其格式类型定义一个新的 GUID。例如,已经定义但尚未匹配注册格式标记的其他格式 GUID 有MEDIASUBTYPE_DOLBY_AC3、MEDIASUBTYPE_DVD_LPCM_AUDIO和MEDIASUBTYPE_MPEG2_AUDIO。 使用WAVEFORMATEXTENSIBLE可以按本文定义的扬声器配置顺序指定某些声道,和/或指定表示样本容器中实际有效位数的内容。该结构仅用于WAVEFORMATEX无法令人满意的情况。 为WAVEFORMATEXTENSIBLE结构的 wFormatTag 字段定义的WAVE_FORMAT_EXTENSIBLE格式标记表示,在确定该结构描述的数据格式时将使用WAVEFORMATEXTENSIBLE的 SubFormat 字段。由于该格式结构包含一个 GUID,因此可以定义表示特定于供应商的 wave 协议或数据格式的子格式,无需向 Microsoft 注册新的 wave 格式标记。 多声道配置WAVE_FORMAT_PCM 中的语义不明确性根据未压缩 PCM wave 格式的传统解释,在多扬声器配置中不能将给定的声道连接到给定的扬声器。始终采用立体声扬声器配置,并且因为nChannels始终为 1 或 2,因此很容易将它们映射到扬声器对。通过专有的,未记录的映射处理nChannels>2 的文件,但可能性非常小,因为只能采用两个扬声器(因此是两个波输出)。 随着改进的音频输出配置的出现,如四声道(四个角)、3.1(左前、中前、右前、低频增强)、5.1(左前、中前、右前、左后、右后、低频增强)等,这种情况发生了改变。必须考虑很多可用于播放和创作的扬声器配置。 目前,用于 5.1 传递的流集合最有可能流化为六声道文件。但是,仍然存在用作同步单声道文件的包的多声道文件。如果不将功能划分为这些文件类型之一,则无法为WAVE_FORMAT_PCM定义默认的多声道扬声器配置。因此,如果nChannels>2,用于WAVE_FORMAT_PCM的声道到扬声器规范仍然不会被记录。 默认声道排序确定将声道数量链接到扬声器位置的方法(从而提供多声道音频文件之间的统一性)是定义在音频文件中排列声道的顺序。多个外部标准定义了以下主声道布局的各个部分:
与这些空间位置相对应的交错流中的声道必须按以上指定的顺序出现。这同样适用于声道子集不连续的情况。例如,如果流包含左、低音增强和右,则声道 1 为左,声道 2 为右,声道 3 为低音增强。这样便能够将多声道流链接到定义明确的多扬声器配置。 警告:用于低频声道的内容可能无法接收数据的扬声器上呈现。这是因为无法保证用户系统中低频扬声器的频率范围。为此,接收低频音频的扬声器可能会筛选掉它无法处理的频率。 表示高分辨率音频WAVE_FORMAT_PCM 中的语义不明确性枚举由WAVE_FORMAT_PCM进行的假设是非常重要的。其中一个假设就是nBlockAlign字段只包含一个样本集(一个块)。而且,块中的每个样本必须是字节对齐。每个样本占用的字节对齐空间称为样本的“容器”。此外,最后一个样本容器的结尾和块的实际结尾之间没有任何额外空间。换句话说,nBlockAlign必须是nChannels的整数倍,并且将该倍数视为样本的“容器大小”。 尽管这不一定是最初目的,但某些实体认为wBitsPerSample等于容器大小。换句话说,假设有效数据的位数等于容器的大小。这种假设同样适用于 8 位和 16 位音频。随着用于呈现器和捕获的高保真装备的出现,也出现了 20 位和 24 位流。在字节对齐流中指定样本的实际位分辨率变得非常重要;可接受的wBitsPerSample解释开始清晰起来,因为并不是所有软件都硬性强制它的值。很多情况下,它依然是容器大小。但是,在其他情况下,该字段用来表示实际有效数据的位数,而容器大小是从nBlockAlign和nChannels推断得出的(例如,wBitsPerSample= 20,nBlockAlign= 8,nChannels= 2)。 解决该问题必然导致出现WAVE_FORMAT_PCM的很多遗留问题,因此新格式包含一个阐明该语义不确定性的附加字段。新格式用来处理精度的实际位数不等于容器大小的情况,以及容器大小大于 16 位的所有情况。 为WAVE_FORMAT_PCM解决wBitsPerSample的语义不确定性不是本文的目的。但是,在新格式中将能够明确使用该字段。 指定实际位深在新格式中,将wBitsPerSample严格定义为容器大小。容器必须是字节对齐,因此wBitsPerSample必须是 8 的倍数。一个新字段表达包含实际数据的确切位数,无论容器大小如何都是如此。当音频通过处理系统时,每个样本的有效数据位数可能有所不同。将每个样本对齐到最高位,这样很容易在样本的底部添加附加精度或者调整为更低的精度。容器大小可以单独操纵,不会隐式对数据精度进行任何更改。32 位容器(用于有效处理)中的 24 位流可以安全地传输到 24 位容器(用于有效存储空间)而不会丢失任何数据。 使用 WAVE_FORMAT_EXTENSIBLE为了解决多声道排序和高精度数据的问题,Microsoft 定义了一个新的结构WAVE_FORMAT_EXTENSIBLE。此新结构不仅仅能够解决这些问题,而且还提供了一个自我注册新数据格式的机制。SubFormat字段设置为指定WAVE_FORMAT_EXTENSIBLE结构所描述数据类型的 GUID。 WAVE_FORMAT_EXTENSIBLE 的定义WAVE_FORMAT_EXTENSIBLE的定义(在 MMREG.H 和 KSMEDIA.H 中)如下:
KSDATAFORMAT_SUBTYPE_PCM的定义(在 KSMEDIA.H 中)如下:
PWAVEFORMATPCMEX可以安全地转换为PWAVEFORMATEXTENSIBLE或PWAVEFORMATEX。
KSDATAFORMAT_SUBTYPE_IEEE_FLOAT的定义(在 KSMEDIA.H 中)如下:
PWAVEFORMATIEEEFLOATEX可以安全地转换为PWAVEFORMATEXTENSIBLE或PWAVEFORMATEX。
有关 WAVEFORMATEX 字段的详细信息后文是解释WAVEFORMATEX结构的字段所遵循的内容、新字段的描述以及力求阐明该格式用法的各种示例。 由于可变的比特率格式的本质(即无法提供静态的wBitsPerSample),规定一些特殊情况是非常有必要的。这些格式类型应该在wBitsPerSample 字段中指定0。 有关 Samples Union 的详细信息为了使WAVEFORMATEXTENSIBLE结构不超过 64 位限制,wValidBitsPerSample和wSamplesPerBlock一起合并到一个称为Samples的并集。还额外添加了一个名为wReserved的字段,以便将来使用。 如果wValidBitsPerSample小于wBitsPerSample,则容器中实际的 PCM 数据为“左对齐”。样本本身对齐最高位;所有额外位位于容器的最低有效位部分。所有非有效数据位必须设置为 0。 wValidBitsPerSample的值不能超过wBitsPerSample的值。如果遇到这种情况,正确的操作是拒绝该数据格式。 处理数据时,实体可能更改wValidBitsPerSample。例如,应用程序应该知道,如果输出驱动程序表示它仅支持wValidBitsPerSample= 16,则wValidBitsPerSample= 24 的流必须调整为 16 位。 尽管从内存带宽的角度来看,这非常昂贵,但也可以更改wBitsPerSample。wValidBitsPerSample表示是否可以在不丢失数据的情况下减小容器大小 (wBitsPerSample)。wValidBitsPerSample= 20 的流;可以安全地将wBitsPerSample= 32(用于 32 位 CPU 进行处理)压缩为wBitsPerSample= 24(用于在磁盘存档)。如果没有wValidBitsPerSample,将无法知道有无数据丢失。 使用 dwChannelMask 指定声道位置为了说明只存在一个可能的扬声器子集,创建了一个新的字段dwChannelMask,用于指定声道到空间位置的映射。为了支持此字段,可以在 sdk\inc\ksmedia.h and sdk\inc\mmreg.h 中找到以下位图:
这些值与各种外部标准中定义的主声道布局完全对应。 作为一个示例,假设nChannels= 4;dwChannelMask= 0x00000033。这表示音频声道应用于播放到左前、右前、左后和右后扬声器。在每个块中声道数据应该以该顺序交错。 使用WAVEFORMATEXTENSIBLE时,考虑保留除了此预定义的设置 18 之外的声道位置。人们应该对除此之外的声道顺序不进行任何假设,只假设 Microsoft 将遵从其他标准。 有关 dwChannelMask 的详细信息字段dwChannelMask表示多声道流中存在的声道。最低有效位与左前扬声器对应,下一个最低有效位与右前扬声器对应,依此类推,按照第 2 部分中定义的顺序。必须按照指定的顺序(最低有效位在上面)提供dwChannelMask中指定的声道。换句话说,如果仅指定左前和中前,则左前应该位于交错流中的第一位。 如果nChannels小于dwChannelMask中设置的位数,则忽略dwChannelMask中的额外(最高位)位。如果nChannels超过dwChannelMask中设置的位数,则不会将其余声道指定给任何特定扬声器位置。音频设备将向未使用的输出端口呈现其余声道数据。 如果音频接收器(如 WDM 音频的内置内核混合器)不知道在没有扬声器位置的情况下如何处理额外声道,则不呈现数据。nChannels超过dwChannelMask中设置的位数可能会产生不一致的结果,应该尽可能避免这种情况。 例如,如果在多声道音频创作应用中,在任何单声道流上不需要扬声器位置,则dwChannelMask应该明确设置为0。dwChannelMask为0告知音频设备将第一个声道呈现到设备上的第一个端口,第二个声道呈现到设备上的第二个端口,依此类推。这也意味着,如果设备不知道如何处理原始音频流,则不应该接受dwChannelMask为0的多声道流。数字混合器或数字音频存储设备(硬盘、ADAT 等)之类的设备需要没有特定扬声器位置的格式。 dwChannelMask值 0xFFFFFFFF(或设置了 DWORD 最高位的任何值)是预先定义的,用于表示实体支持所有可能的声道配置。示例为 WDM 音频的内置内核混合器。不存在与dwChannelMask最高位相对应的位置,因此该值是不确定的。 该格式不处理与定义的值不对应的扬声器位置,但 Microsoft 保留将来定义它们的权利。 示例 多声道 16 位
音频数据的四个声道按照以下方式放置到内存中,指向该内存的指针存储在WAVEHDR结构的lpData成员中。 字节 1 - 声道 1,左前,低等字节 同样,PWAVEFORMATPCMEX可以安全地转换为PWAVEFORMATEXTENSIBLE或PWAVEFORMATEX以便获得可移植性。
三字节音频数据的两个声道按照以下方式放置到内存中,指向该内存的指针存储在WAVEHDR结构的lpData成员中。 字节 1 - 声道 1,左前,低等字节,只有顶部四个位为有效数据位 注意:nAvgBytesPerSec使用块大小 (nBlockAlign) 计算,而不是容器大小 (wBitsPerSample) 或有效位的实际数量 (wValidBitsPerSample)。
三字节音频数据的两个声道按照以下方式放置到内存中,并且指向该内存的指针存储在WAVEHDR结构的lpData成员中。 字节 1 - 声道 1,左前,低等字节,只有顶部四个位为有效数据位
四字节音频数据的两个声道按照以下方式放置到内存中,指向该内存的指针存储在WAVEHDR结构的lpData成员中。 字节 1 - 声道 1,中央偏左,低等字节,无有效数据 这些流可以通过缩放算法发送,该算法将小数值放置到低 9 位,仅对采用波形格式结构的值更改为:
使用 WAVEFORMATIEEEFLOATEX 的示例
字节 1 - 声道 1,左前,低等字节,无有效数据
字节 1 - 单声道 1,低等字节,有效浮点数据 |
MS 多声道音频数据和 WAVE 文件
最新推荐文章于 2024-07-24 22:17:01 发布
|