怎样用Dspack+TCP来实现音频传输(200分)

  • 主题发起人 菜鸟黄
  • 开始时间

菜鸟黄

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样用Dspack+TCP来实现音频传输
 
局域网传还是跨网段传?
DSPACK可以直接播放带网址的视频,用IIS最好办,直接给个音频网址就行了
如果用TCP传,那就是文件传输的问题了,可以抛开DSPACK
 
怎样把音频流转化为内存流?
 
Stream:=Tstream.create;
stream.loadfromfile('c:/1.wav');
steam.free;
 
我的音频是麦克风的
 
to madeagle
如果是这么简单的话,我就不用提问了.[:D]
 
全文检索acm啊! 连空间和里子读有!
 
我不想用ACM,Dspack应该也可以的~有朋友知道吗?
 
Dspack没有数据采集的OnDada事件吗?
Dspack没有播放指定指针数据PlayDada函数吗?
如果有,中间加上tcp传输
 
现在我已经实现了音/视频的点对点传输,但是声音延时差不多1秒(用ACM),视频(用Dspack)
我现在想延时尽量的少,不知应该如何做
 
如果有人知道可以用Dspack的方法,请教下小弟...
 
1. 延时1秒不关ACM的事;
2. (音频数据采集+网络传输)与延时的关键参数是: 获取数据块的频率;
3. 例如: 你3秒钟取一次数据, 总延时=3秒+网络传输延时;
你1秒钟取一次数据, 总延时=1秒+网络延时;
你1秒中取8次数据, 总延时=0.125秒 + 网络延时;
//很多网络实时语音系统都采样 8次/秒;
4次/秒也能基本满足要求;
4. 提示: 设定音频数据采集的buffer的大小与数量来确定取数频率....
5. 无论你用ACM还是Dspack或者其他的, 都基本这样...
 
设定音频数据采集的buffer的大小与数量来确定取数频率....
能具体用代码解释一下吗?
 
没有人用过Dspack来采集音频并用于实时传输吗?
 
因为在DSPACK里面使用MIC过滤器来获取数据时,它是1秒给你一个数据包,你需要自己来设置包的大小,我给你点参考代码:
var
pmt1, pmt2: PAMMEDIATYPE;
wav1, wav2: TWAVEFORMATEX;
p_Allocator: IMemAllocator;
pProps, tmpProps: TALLOCATORPROPERTIES;
.........................
new(pmt1);
new(pmt2);
wav1.wFormatTag := WAVE_FORMAT_PCM;
wav1.nChannels := 1;
wav1.nSamplesPerSec := 8000;
wav1.nAvgBytesPerSec := 16000;
wav1.nBlockAlign := 2;
wav1.wBitsPerSample := 16;
wav1.cbSize := 2;
CreateAudioMediaType(@wav1, pmt1, true);


if (FilterGraph as IGraphBuilder).ConnectDirect(FindFirstOutputPin(MicFilter), FindPin(AudioMixer, 'Input'), pmt1) <> S_OK then

begin

WriteLog('连接音频调节过滤器失败!', 2);
exit;
end;
 
还少了一点:
(FindPin(AudioMixer, 'Input') as IMemInputPin).GetAllocator(p_Allocator);
p_Allocator.GetProperties(pProps);
pProps.cBuffers := 8;
pProps.cbBuffer := 320;
p_Allocator.SetProperties(pProps, TmpProps);
 
减少延时,设置采集包大小,可以用DSPACK,也可以用WaveX音频函数采集,waveInOpen等,网络不要使用TCP,TCP在互联网上,延时较大,用UDP,因为是时时性,所以丢一些数据包无所谓,当然,丢多了就不太好了哟
 
现在我已经实现了1对1的音视频传输,还有就是多对多的视频传输了,但遇到两个问题:
1.当视频数量2个以上时,服务器在一段时间后会崩溃(内存都已经做了Free处理)
2.当接收到多个音频数据时,如何将它们混音播放出来.
 
我的QQ:38993286
希望对这方面有兴趣的朋友共同交流一下.
 
顶部