!!!! 如何将16位的WAV文件转化为8为的WAV文件

时间:2023-01-25 06:38:30
如题,
    对声音这块我不是很熟, 刚刚开始涉入这方面 希望你能给些代码 
谢谢!

9 个解决方案

#1


如果你想用API函数直接完成,可以查询msdn中acm打头的函数。关于16BIT和8BIT的PCM音频格式,你可以看一下DirectShow SDK的一个例子DXSDK9\Samples\C++\DirectShow\Filters\Scope。

#2


支持!

#3


谢谢!
 To All:
    还有个问题;  我用mmioRead()来读取WAV文件 可以使用while循环吗? 没次只读一部分吗?
   我是这么做的 没次读出960个 然后压缩打包发送到另一个机器上,在那台机器上拆包再播放  只能听见咯咯的声音/  
  这么做可以吗?

#4


应该没有问题,问题是播放的格式头必须和采集的一致,你可以尝试读多一点字节的东西
发送过去,还有你可以不用发送,边读边放来测试

#5


把PCM数据取出来,然后把16位数据取高8位,再加128;这样的结果就是8位数据了

#6


楼上的说的基本正确,还要修改相应的头结构!

#7


继续跟踪!

#8


用DirectShow、acmStreamConvert都可以实现
1.DirectShow
   SRC Filter-->Wave Parser---->PCM---->Wave Dest------->File Writer
   配置PCM:

    IPin *pin1=FindPin(PCMCompressor,PINDIR_OUTPUT,"Output");
    IAMStreamConfig *pConfig;
    pin1->QueryInterface(IID_IAMStreamConfig, (void **)&pConfig);

    AM_MEDIA_TYPE *pmt={0};
    pConfig->GetFormat(&pmt);

     WAVEFORMATEX *pWF = (WAVEFORMATEX *) pmt->pbFormat;
     pWF->nChannels = (WORD) wf.nChannels;
     pWF->nSamplesPerSec = wf.nSamplesPerSec;
     pWF->nAvgBytesPerSec = wf.nAvgBytesPerSec;
     pWF->wBitsPerSample = 8;
     pWF->nBlockAlign = wf.nBlockAlign;
     hr = pConfig->SetFormat(pmt);

    

#9


mark

#1


如果你想用API函数直接完成,可以查询msdn中acm打头的函数。关于16BIT和8BIT的PCM音频格式,你可以看一下DirectShow SDK的一个例子DXSDK9\Samples\C++\DirectShow\Filters\Scope。

#2


支持!

#3


谢谢!
 To All:
    还有个问题;  我用mmioRead()来读取WAV文件 可以使用while循环吗? 没次只读一部分吗?
   我是这么做的 没次读出960个 然后压缩打包发送到另一个机器上,在那台机器上拆包再播放  只能听见咯咯的声音/  
  这么做可以吗?

#4


应该没有问题,问题是播放的格式头必须和采集的一致,你可以尝试读多一点字节的东西
发送过去,还有你可以不用发送,边读边放来测试

#5


把PCM数据取出来,然后把16位数据取高8位,再加128;这样的结果就是8位数据了

#6


楼上的说的基本正确,还要修改相应的头结构!

#7


继续跟踪!

#8


用DirectShow、acmStreamConvert都可以实现
1.DirectShow
   SRC Filter-->Wave Parser---->PCM---->Wave Dest------->File Writer
   配置PCM:

    IPin *pin1=FindPin(PCMCompressor,PINDIR_OUTPUT,"Output");
    IAMStreamConfig *pConfig;
    pin1->QueryInterface(IID_IAMStreamConfig, (void **)&pConfig);

    AM_MEDIA_TYPE *pmt={0};
    pConfig->GetFormat(&pmt);

     WAVEFORMATEX *pWF = (WAVEFORMATEX *) pmt->pbFormat;
     pWF->nChannels = (WORD) wf.nChannels;
     pWF->nSamplesPerSec = wf.nSamplesPerSec;
     pWF->nAvgBytesPerSec = wf.nAvgBytesPerSec;
     pWF->wBitsPerSample = 8;
     pWF->nBlockAlign = wf.nBlockAlign;
     hr = pConfig->SetFormat(pmt);

    

#9


mark