日期:2014-05-16  浏览次数:20638 次

[求助]关于linux下流媒体编程的问题
求助各位大人:
              小弟正在Linux下用C语言作一个声音传输的系统,也就类似于QQ中的语音聊天在linux下的实现。现在遇到了问题如下,希望有达人能指点一二:
我分了两个功能模块:
1.一个发送模块负责从话筒录音并用socket发送;
2.接收模块:从网络接收声音数据并播放。
问题:
a.发送端需实现边录音边发送,这样应开开辟多大的缓冲区来存放录音的数据?如何与发送保持同步?显然无论录音过快或发送过快都会导致声音断断续续的。
b.接收端需边下载边播放。同样会遇到与发送端相反的问题。
c.两个弄能模块即两个线程,应该是同时运行的,他们如何来共享一个声卡设备?显然他们不是并发的。应该是随机的。
                  我在网上也看过类似的帖子,不过都是介绍用jrtplib来作的,我想自己用c来编可以实现么?

------解决方案--------------------
泼冷水没啥意思吧,

rtp/rtcp流媒体实现,和linux实时语音处理我曾经做过,但为分开的两个项目。

给些建议:

rtp协议有现成的程序可以参考,你说的jrtplib就是。记得以前用过一个叫live media的库非常好用。网站是www.live555.com

a.发送端需实现边录音边发送,这样应开开辟多大的缓冲区来存放录音的数据?如何与发送保持同步?显然无论录音过快或发送过快都会导致声音断断续续的。
A:缓冲区大小需要试验,因为网络情况可能比较复杂,比较好的方法我看过的是在开始时来测量网速来制定缓冲区大小。发送和接收不一定需要同步,因为是独立的两件事情,如果一定要的话,很多同步的方法阿。实际情况过慢可能性会大很多。

b.接收端需边下载边播放。同样会遇到与发送端相反的问题。
不妨先做好一边,再来考虑两边一同的情况。网速是个瓶颈。

c.两个弄能模块即两个线程,应该是同时运行的,他们如何来共享一个声卡设备?显然他们不是并发的。应该是随机的。
现在的声卡设备很多是双工的,可以同时写入读出的。
------解决方案--------------------
发送和录音共享一块缓冲区,根据录音数据的速率,通常存放3秒的数据就够了,减少录音与发送的耦合性就不会有声音断断续续的问题了,两者不需要同步,只要保证数据完整就可以了。
接收和播放是同样的原理,可以减少网络波动带来的声音播放问题。