? 关于将两个声音流合并成一个的问题,两个声音流分别是一秒,合并成一秒(100分)

  • 主题发起人 主题发起人 ASDC
  • 开始时间 开始时间
A

ASDC

Unregistered / Unconfirmed
GUEST, unregistred user!
在用ACM控件做局域网语音程序的时候,
如果一台计算机同时收到其他好5台计算机发来的1秒钟的流,分别将其添加进playback过程,会产生一个5秒的声音播放。而这些声音应该是在一秒内播放完成,就是相当于将这5个流合并成一个1秒的流。
知道这个声音流的具体参数,比如格式、频率等。
谢谢各位!!
 
你想用控件,还是混音的算法呢?
 
to qinc:
我采集和播放用的是ACM控件;
现在已经得到ACM采集的数据流,想把它和起来播放。

合并的方法用控件也行、算法也行,只要能方便实现就可以了。
 
以下使用DX播放多个WAV的例子,控件我再帮你找找
procedure TForm1.FormShow(Sender: TObject);

var
hRet: HRESULT;

BufDesc: TDSBufferDesc_DX7;

Format: TWaveFormatEx;

PCM: TWaveFormatEx;

begin

hRet := DirectSoundCreate(nil, DXSound, nil);

if hRet <> DS_OK then

begin

ErrorOut(hRet, 'DirectSoundCreate');

Close;

end;



hRet := DXsound.SetCooperativeLevel(Handle, DSSCL_Priority);

if hRet <> DS_OK then

begin

ErrorOut(hRet, 'SetCooperativeLevel');

Close;

end;



FillChar(BufDesc, SizeOf(TDSBufferDesc), 0);

BufDesc.dwSize := SizeOf(TDSBufferDesc);

BufDesc.dwFlags := DSBCAPS_PRIMARYBUFFER;

BufDesc.dwBufferBytes := 0;

BufDesc.lpwfxFormat := nil;


hRet := DXSound.CreateSoundBuffer(BufDesc, DXSPBuffer, nil);

if hRet <> DS_OK then

begin

ErrorOut(hRet, 'CreateSoundBuffer');

Close;

end;



FillChar(PCM, SizeOf(TWaveFormatEx), 0);

with PCMdo

begin

wFormatTag := WAVE_FORMAT_PCM;

nChannels := 2;

nSamplesPerSec := 44100;

nBlockAlign := 4;

wBitsPerSample := 16;

cbSize := 0;

nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;

nBlockAlign := (wBitsPerSample div 8) * nChannels;
// = 4
end;



hRet := DXSPBuffer.SetFormat(PCM);

if hRet <> DS_OK then

begin

ErrorOut(hRet, 'SetFormat');

Close;

end;



if not CreateSecondaryBufferFromWav(DXSound, DXSSBuffer1, WaveFile) then
showmessage('error');

if not CreateSecondaryBufferFromWav(DXSound, DXSSBuffer2, WaveFile) then
showmessage('error');

end;
 
找到一个帖子,可能对你有帮助:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=107371
 
不过我觉得网路传输WAV太占用网络资源了,不如在Client压缩成MP3,通过UDP发送至服务端,服务端进行混,MMTOOL就可以解决你的播放和混音问题,只是解密做的不太好
 
郁闷啊,刚才回贴时网络中断,回退又找不到输入的文字

1。谢谢推荐,那篇文章确实不错,特别回帖的那位讨论很深入。
2。我采用UDP,但是用广播方式,不设服务器。声音编码用ACM提供的GSM6.10,10K/s,(声效可以接受),这样同时10个人说话,也就100K/s,不知UDP广播的网络流量是否这样计算。昨晚试了一下,两台机互相通话,效果还可以,现在主要就是要解决那个接收端混音问题,
如果这个问题能得到解决,这个程序就可以用在联机游戏里了,当然具体效果还需要测试。
3。你说的那个DX是控件还是,delphi自带的单元?
 
2、最好不要采用广播方式,数据量一大,整个网络简直是网络风暴,还是采用组播吧。至于混音,还是研究研究MMTOOL吧。
3、我说的DX就是DirectSound
 
1。先用广播试试,因为就是在局域网用,一般就10台以下。等混音搞定后再搞组播,一样一样来。
2。mmtool听说过,查查资料去
3。你有关于DirectSound的资料吗,简单的那种,够用就行。
 
给我你的Mail,发给你
 
不好意思,周末没有上网!
asdc@263.net
谢谢!!
 
已经给你发Mail了
 
这个问题好难啊,看懂qince的资料还要花些时间,有谁有更简单的解决办法的,比如几个函数,只要能解决问题就够了,谢谢!
 
你说的是声音合成?
如果是的话,先把声音线性化,再叠加,最后编码(非线性化)
我用delphi实现过,速度还可以,至少在CTI系统里面感觉不到延迟。
 
to :alter
{
你说的是声音合成?
如果是的话,先把声音线性化,再叠加,最后编码(非线性化)
我用delphi实现过,速度还可以,至少在CTI系统里面感觉不到延迟。
}
老兄如何实现,能否告之原理。谢谢!fzwlf2002@sina.com
 
to alter:
就是声音合成的意思,我不太清楚叫合成或是叫混音,反正就是把几个一秒的声音流合成一个一秒的声音流。
能不能将实现的原理或者函数代码告诉一下。
 
结贴了吧,以后再讨论,当然谁有好办法还是发个给我asdc@263.net
 
结贴了,这个问题看来只有自己看看资料再说了。
谢谢各位!
 
后退
顶部