做过网络电话的兄弟们请进 -【200分】

2ndboy 2002-10-16 01:32:12
由于语音数据压缩和网络传输的耗时,所以送到对方的每个包之间都有一小段时隙,所以回放的效果就变成断断续续的了,大家是怎么处理的?有什么办法能让送到对方的语音尽量连续流畅吗?

我现在采用的一个临时解决方法是收到 2,3 个包之后再把他们组合在一块儿一起播放,可是这样在一段稍长的连续语音过后还是会有一小段间断。

先谢谢各位了,有比较完美的解决方案的话一定重谢,分不成问题!!!
...全文
110 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
E 2002-10-19
  • 打赏
  • 举报
回复
我想你可以参考RTP(RFC1889和1890)。几乎所有的IP电话话音传送都是用RTP。
2ndboy 2002-10-19
  • 打赏
  • 举报
回复
谢谢 huhairui3(浩月):

我目前就是采用你说的多缓冲机制,不过我的采样缓冲区大小是随意定的,你上面说的那个数据“不要超过1/20秒一帧”是规定吗?意思是每个采样缓冲区只存放1/20秒的语音数据?
huhairui3 2002-10-19
  • 打赏
  • 举报
回复
在snsins(不再信仰,不再坚持)的基础上,音频采集采用双缓冲采集可以尽量降低音频压缩延时。
具体做法是定义两个PWAVEHDR结构,分别分配单独的缓冲区。然后在开始采集的地方执行
waveInPrepareHeader(m_hWaveIn, m_pWaveHdrIn1, sizeof(WAVEHDR));
waveInPrepareHeader(m_hWaveIn, m_pWaveHdrIn2, sizeof(WAVEHDR));

waveInAddBuffer(m_hWaveIn, m_pWaveHdrIn1, sizeof(WAVEHDR));
waveInAddBuffer(m_hWaveIn, m_pWaveHdrIn2, sizeof(WAVEHDR));

即两个缓冲区同时采集,
在WIM_DATA消息到来后执行:
waveInAddBuffer(pWaveCap->m_hWaveIn, (PWAVEHDR)msg.lParam, sizeof(WAVEHDR));让数据充满的缓冲区继续采集。

同样在音频播放时也采用双缓冲区播放。

另为提醒你一下,采集缓冲区的大小要合适,不要超过1/20秒一帧,否则压缩和传输延时 将大于采集时间声音会出现停顿。



jincai78 2002-10-19
  • 打赏
  • 举报
回复
缓冲区得大小一般为512byte就ok了,而且这样发送广播数据也没问题.
缓冲区的数目也无需过多,3个就ok了。
一边录音一边发送,当接收端的第二个缓冲区满后就可以播放了。
我这样试过,声音很流畅,可以唱歌的。

pcm的格式可以设置的低一点,以便减少数据.

glhorse 2002-10-18
  • 打赏
  • 举报
回复
xuexi
snsins 2002-10-18
  • 打赏
  • 举报
回复
建一个缓冲区,把收到的包先缓冲,当缓冲区满了之后再播放,这样边缓冲边播放,
不过估计解决了流畅问题会有延迟,
2ndboy 2002-10-17
  • 打赏
  • 举报
回复
to qrlvls(怜松):

我觉得这跟网络传输实际上已经没什么关系了,因为从理论上分析的话不管怎么样传送每两个包之间也总会有个很小的时隙,现在就是看如何能消除它的影响。
qrlvls 2002-10-17
  • 打赏
  • 举报
回复
加入QoS控制试试呢
ttzzgg_80713 2002-10-17
  • 打赏
  • 举报
回复
关注一下先
2ndboy 2002-10-17
  • 打赏
  • 举报
回复
to everandforever(Forever):

你所说的“一种很怪的断续情况”是怎么样的?是不是以固定频率断续?如果是的话我觉得就是每个语音数据包之间的那一小段时隙造成的。
DirectSound 还没用过,有时间就试一下。
2ndboy 2002-10-17
  • 打赏
  • 举报
回复
to VisualStudio(嗷~~~):

我的数据报是 80 字节,你说的“使用多缓冲”是指接收缓冲还是播放缓冲?那个 SpeakFreely 使用了“预读取”之后就没有断续现象了吗?
everandforever 2002-10-17
  • 打赏
  • 举报
回复
我当时用WAVEOUT...播放语音包有一种很怪的断续情况, 后来换用 DIRECT SOUND输出就没有这种情况了.
everandforever 2002-10-17
  • 打赏
  • 举报
回复
to everandforever(Forever):
从理论上讲就是每个包之间都有延时啊
__________________

录音和放音的速度是一样的, 包之间虽然有延时, 但延时应该小于等于前一个包里的数据的播放时间, 如果大于的话, 就会断续,那就是说最终会丢包/阻塞.
VisualStudio 2002-10-17
  • 打赏
  • 举报
回复
to 2ndboy(丢丢)
或者你的数据报过大,或者和你使用多缓冲有关,不知道你呀所数据包没有?
2ndboy 2002-10-17
  • 打赏
  • 举报
回复
to everandforever(Forever):
从理论上讲就是每个包之间都有延时啊

to chen_jun_fen(bitwise):
我现在就是使用多个缓冲

to VisualStudio(嗷~~~):
我试了一下你提到的方法,大约播放 30 秒平滑的声音之后还是会有一个小停顿。
chen_jun_fen 2002-10-17
  • 打赏
  • 举报
回复
采用多个缓冲
everandforever 2002-10-16
  • 打赏
  • 举报
回复
ACM 音频压缩管理器。一般来说,不会有这种情况。 虽然有延时,但是每个包的延时应该是一样的,如果每个包之间都有延时,那岂不是延时越来越长?
dy_paradise 2002-10-16
  • 打赏
  • 举报
回复
向高手学习~~~ 学习~~` 再学习~~
dy_paradise 2002-10-16
  • 打赏
  • 举报
回复
学习~~~ 学习~~~
2ndboy 2002-10-16
  • 打赏
  • 举报
回复
我刚看了
http://www.csdn.net/Expert/TopicView1.asp?id=1050963
这个帖子,不过好象讨论了半天最后无疾而终了。

谢谢 yaotang(baobao),不过好象确实跟我的情况不一样。

to smhpnuaa(天将降大任于斯人也!):
我好象从那三个字母里看不出什么解决方法,能麻烦你说详细一点吗?
加载更多回复(7)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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