日期:2014-05-17  浏览次数:21255 次

wave 文件中的数据转换
最近很想去做音频开发,于是私自研究了下播放器,

目前用win7的 core audio 写了个小demo,界面弄了一下下,然后写到了播放部分,core audio这块的api熟悉了之后,目前开始写第一个支持的格式,从wave下手了,因为这个是最直白的格式了吧....

然后我创建了共享模式的IAudioClient,然后手头上有个wave文件,使用千千静听转换的;

pwfDeviceFormat 是WAVEFORMATEX指针


//如果数据格式不是整数或浮点则创建失败
switch (m_pwfDeviceFormat->wFormatTag)
{
case WAVE_FORMAT_IEEE_FLOAT:
m_eDeviceDataFormat = Data_Float;
break;

case WAVE_FORMAT_PCM:
m_eDeviceDataFormat = Data_Int;
break;

case WAVE_FORMAT_EXTENSIBLE:
{
WAVEFORMATEXTENSIBLE *pExt = reinterpret_cast<WAVEFORMATEXTENSIBLE*>(m_pwfDeviceFormat);
if ( KSDATAFORMAT_SUBTYPE_IEEE_FLOAT == pExt->SubFormat )
m_eDeviceDataFormat = Data_Float;
else if ( KSDATAFORMAT_SUBTYPE_PCM == pExt->SubFormat )
m_eDeviceDataFormat = Data_Int;
}
break;

default:
m_eDeviceDataFormat = Data_Unknown;
break;
}

1  得到的匹配的数据格式是浮点格式,然后wave的数据内容好像是PCM,也就是整数?

然后现在该怎么将整数格式转换到浮点呢??

2 文件的格式是 两个通道,  每个nBlockAlign是16bit ,而设备支持的格式是nBlockAlign = 32bit ,并且每秒采样数(nSamplesPerSec)大于文件中的采样率,这个大概是要进行线性插值,但是如何从16bit 转换到 32bit?  

已经研究好久了 ,实在搞不定了特此求助各位高手!! 多谢了!
------解决方案--------------------
推荐使用NCTAudioStudio控件处理音频。
------解决方案--------------------
1.整数转浮点数还不简单/1.0后就直接变成浮点数了

2.16bit转32bit

一般情况下X86 windows的都是低位在后,高位在前的。

就是short 和int的转换
直接强转附值过去即可。

(万一不正确的话,通过>>16来保证正确性)