关于DirectSound中播放杂音问题(与DirectSound实时播放杂音很大的问题,请各位看看是什么原因导致问题相同)

faerii 2008-04-10 03:13:44
查了一下CSDN的信息发现原先一个人也有类似问题,但是没有给定处理问题的方法,
实时数据流为PCM 8k
数据采样位数为8位
声道数量为1

在创建缓冲区时候
WAVEFORMATEX wfx 设置如下

memset(&wfx,0,sizeof(wfx));
wfx.wFormatTag = 1;//波形音频的格式
wfx.nSamplesPerSec = 8000;//ixf;//11250; //指定数据采样率8000=8 kHz
wfx.wBitsPerSample = 8; //数据采样位数8位或16位
wfx.nChannels = 1; //声道数量
wfx.nBlockAlign = 1;//wfx.nChannels*(wfx.wBitsPerSample>>3);
wfx.cbSize = 0;//WAVEFORMATEX结构的大小(in byte)wFormatTag== WAVE_FORMAT_PCM,则可忽略
wfx.nAvgBytesPerSec = 8000;//wfx.nSamplesPerSec * wfx.nBlockAlign;//11250;ixf;////数据传输速率
最后给个结论是 “通过努力,问题已经得到解决,原来是格式上问题,看来只有自己得分了”
这里还是不清楚 格式上问题到底是啥问题,还请专家帮忙查看
...全文
713 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyayi2006 2010-08-28
  • 打赏
  • 举报
回复
新帖必看,原创必顶!
虽然您的问题 咱无法回答。
但这个人场 咱捧了!


tellmey 2010-08-24
  • 打赏
  • 举报
回复
发现是有这个问题,也碰到了.
KudoCC 2010-08-24
  • 打赏
  • 举报
回复
播放块1的时候,需要填充块2的,所以开始的时候要不要设置开始位置为0,设置成10吧,我试了一下,就算设置成1也不行。

最开始的时候,播放块1,一开始播放就会得到通知,这样就会出现填充的位置和读写的位置相同。
tyg111 2010-08-03
  • 打赏
  • 举报
回复
用DirectSound写的播放实时语音的时候全是杂音,使用SDK自己带的例子FullDuplexFilter.exe也是这样,所以程序应该是没有问题的.最初以为是安装了某个软件影响到了DirectSound.于是把能卸的都卸了,问题依然存在.最后在音量控制里找到原因了.原来DirectSound播放实时语音的时候不能开启立体声混音功能.只要把这个选项勾上就可以了.
这个是在网上找的,希望对你有帮助
ivanwucn 2010-04-13
  • 打赏
  • 举报
回复
分享一下我今天的成果,一开始我也是有杂音,也许是因为缓冲的大小的原因。当我把缓冲的大小变成数据的大小时,就没有出现杂音了。

//缓冲大小=采样率*采样位数(bits)/8*通道数*时间
//dsbufferdesc.dwBufferBytes=22050*8/8*1*1;
dsbufferdesc.dwBufferBytes=5000;
我的数据不到1秒,但是为了好看,所以一开始我把缓冲弄成注释那个样子。
但是调了之后就好了。

希望对大家有用
村过去 2009-11-26
  • 打赏
  • 举报
回复
不会是你自己机子硬件问题吧,一些劣质的主板采集出来的声音总是有噪音的。你用微软附件里的录音机试试你本机的音质?
饺子87 2009-11-21
  • 打赏
  • 举报
回复

/// <summary>
/// 创建音频格式
/// </summary>
/// <param name="samplesPerSecond">采样率</param>
/// <param name="bitsPerSample">采样大小</param>
/// <param name="channels">声道</param>
public WaveFormat CreateWaveFormat(int samplesPerSecond, short bitsPerSample, short channels)
{
try
{
WaveFormat waveFormatTemp = new WaveFormat();

waveFormatTemp.FormatTag = WaveFormatTag.Pcm;
waveFormatTemp.SamplesPerSecond = samplesPerSecond; //每秒采样次数
waveFormatTemp.BitsPerSample = bitsPerSample; //每次采样位数
waveFormatTemp.Channels = channels; //采样通道数
waveFormatTemp.BlockAlign = (short)(waveFormatTemp.Channels * (waveFormatTemp.BitsPerSample / 8)); //每次采样字节数
waveFormatTemp.AverageBytesPerSecond = waveFormatTemp.BlockAlign * waveFormatTemp.SamplesPerSecond; //每秒采样字节数

return waveFormatTemp;
}
catch
{
throw (new Exception("创建音频格式失败!"));
}
}


另外据说低于16000Hz 16bit的音频质量将大幅下降
lujunweixu 2009-08-23
  • 打赏
  • 举报
回复
/////////////////////////////////////////////////////////
WAVEFORMATEX wfx 设置如下

memset(&wfx,0,sizeof(wfx));
wfx.wFormatTag = 1;//波形音频的格式
wfx.nSamplesPerSec = 8000;//ixf;//11250; //指定数据采样率8000=8 kHz
wfx.wBitsPerSample = 8; //数据采样位数8位或16位
wfx.nChannels = 1; //声道数量
wfx.nBlockAlign = 1;//wfx.nChannels*(wfx.wBitsPerSample>>3);
wfx.cbSize = 0;//WAVEFORMATEX结构的大小(in byte)wFormatTag== WAVE_FORMAT_PCM,则可忽略
wfx.nAvgBytesPerSec = 8000;//wfx.nSamplesPerSec * wfx.nBlockAlign;//11250;ixf;////数据传输速率
最后给个结论是 “通过努力,问题已经得到解决,原来是格式上问题,看来只有自己得分了”
这里还是不清楚 格式上问题到底是啥问题,还请专家帮忙查看
///////////////////////////////////////////////////////////////

我个人觉得这个问题应该是wfx.nBlockAlign = 1;//wfx.nChannels*(wfx.wBitsPerSample>>3);没有设置好的原因,在DirectSound的SDK中有说过如果声音格式是PCM则
wfx.nBlockAlign = wfx.nSamplesPerSec * wfx.nChannels / 8;
具体你可以查查看,我最近也碰到过DirectSound的杂音问题,所以查了这方面的资料。
rightorwrong 2009-06-18
  • 打赏
  • 举报
回复
采集时可以把 wfx.wBitsPerSample设置为16相信效果会好
  • 打赏
  • 举报
回复
我也有这样的问题,帮你顶一下。
pengyouafei 2008-08-02
  • 打赏
  • 举报
回复
顶一下,可能以后也会遇到类似问题
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
viper1433 2008-04-24
  • 打赏
  • 举报
回复
有可能是DS对低品质音频的支持不是太好,你可以试一下先把数据进行差值(重采样和位差值),把样本统一到比如44100,16位这样,再播放,如果音质没变化,那就是音源的问题,如果音质提高了,那就是DS对低品质音频支持不好(算法上是不会提高音质的)!
local_sixue 2008-04-24
  • 打赏
  • 举报
回复
我也在用directsound,也有这个噪音问题,我看到这个跟ddsd的数据 dwbufferbytes有很大关系,自己调整过大小,效果都很不同。
参看mplyaer ao_directx.c有初始化的例子,有个公式计算的,用wFormat的数据。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧