对声音这块我不是很熟, 刚刚开始涉入这方面 希望你能给些代码
谢谢!
9 个解决方案
#1
如果你想用API函数直接完成,可以查询msdn中acm打头的函数。关于16BIT和8BIT的PCM音频格式,你可以看一下DirectShow SDK的一个例子DXSDK9\Samples\C++\DirectShow\Filters\Scope。
#2
支持!
#3
谢谢!
To All:
还有个问题; 我用mmioRead()来读取WAV文件 可以使用while循环吗? 没次只读一部分吗?
我是这么做的 没次读出960个 然后压缩打包发送到另一个机器上,在那台机器上拆包再播放 只能听见咯咯的声音/
这么做可以吗?
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);
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个 然后压缩打包发送到另一个机器上,在那台机器上拆包再播放 只能听见咯咯的声音/
这么做可以吗?
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);
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