|
发表于 2007-2-14
|
|阅读模式
多声道音频数据和 WAVE 文件
最近碰到一多通道的PCM,几个主流的Player都不能发出声音,为了让自己的播放器能支持这个格式,所以研究了一下, 收集一资料转贴一下http://msdn.microsoft.com/zh-cn/windows/hardware/gg463006。
KSDATAFORMAT_SUBTYPE_PCM:
采用 5.1 格式的 6 声道
以下WAVEFORMATPCMEX结构可以指定为解码器针对 5.1 扬声器布局生成音频流的输出结构。
WAVEFORMATPCMEX waveFormatPCMEx;
waveFormatPCMEx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
waveFormatPCMEx.Format.nChannels = 6;
waveFormatPCMEx.Format.nSamplesPerSec = 48000L;
waveFormatPCMEx.Format.nAvgBytesPerSec = 864000L; // Compute using nBlkAlign * nSamp/Sec
waveFormatPCMEx.Format.nBlockAlign = 18;
waveFormatPCMEx.Format.wBitsPerSample = 24; //Container has 3 bytes waveFormatPCMEx.Format.cbSize = 22;
waveFormatPCMEx.wValidBitsPerSample = 20; // Top 20 bits have data
waveFormatPCMEx.dwChannelMask = KSAUDIO_SPEAKER_5POINT1;
// SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT |
// SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY |
// SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT
waveFormatPCMEx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; // Specify PCM
三字节音频数据的两个声道按照以下方式放置到内存中,并且指向该内存的指针存储在WAVEHDR结构的lpData成员中。
字节 1 - 声道 1,左前,低等字节,只有顶部四个位为有效数据位
字节 2 - 声道 1,左前,中等字节,全部是有效数据
字节 3 - 声道 1,左前,高等字节,全部是有效数据
字节 4 - 声道 2,右前,低序位字节,顶部四个位为有效数据位
字节 5 - 声道 2,右前,中等字节,全部是有效数据
字节 6 - 声道 2,右前,高等字节,全部是有效数据
字节 7 - 声道 3,中前,低序位字节,只有顶部四个位为有效数据位
字节 8 - 声道 3,中前,中等字节,全部是有效数据
字节 9 - 声道 3,中前,高等字节,全部是有效数据
字节 10 - 声道 4,低频、低序位字节,顶部四个字节为有效数据位
字节 11 - 声道 4,低频,中等字节,全部是有效数据
字节 12 - 声道 4,低频、高等字节,全部是有效数据
字节 13 - 声道 5,左后,低序位字节,只有顶部四个位为有效数据位
字节 14 - 声道 5,右后,中等字节,全部是有效数据
字节 15 - 声道 5,左后,高等字节,全部是有效数据
字节 16 - 声道 6,右后,低序位字节,顶部四个位为有效数据位
字节 17 - 声道 6,右后,中等字节,全部是有效数据
字节 18 - 声道 6,右后,高等字节,全部是有效数据
字节 19 - 声道 1,左前,低等字节,顶部四个位为有效数据位,样本 2
字节 20 - 声道 1,左前,中等字节,全部是有效数据,样本 2 等 |
|