5

我目前正在计划我的最后一年的项目,我希望创建一个支持 IP 语音和基于文本的聊天的应用程序(尽管不是“下一个 skype”)。我只是真的想要一种易于使用的轻量级方式来完成 voIP 部分,并且它不需要扩展数量的功能,至少不需要一开始。

我想要的功能之一是它不通过服务器,但那是因为我不想在应用程序发布后维护服务器。因此,如果可以将您的 IP 提供给某人并且他们加入使用它会更好。

我打算将 Qt 框架用于 GUI,尽管它可以更改,语言 (C++) 也可以更改,所以没有什么是一成不变的。该软件将在 Windows 上运行。

我看过 H.323、sip 和其他一些开源,但似乎很难进入,我无法弄清楚他们是否做了我需要他们做的事情。

我应该研究的任何开源库都可以部分满足我的需求吗?我错过了什么来源?我对 voIP 世界完全陌生,可以朝着正确的方向推动。同样,如果有一种语言以简单的方式执行此操作,我可以切换,因为我目前处于计划阶段。感谢我得到的任何帮助。

4

2 回答 2

3

首先,几个月前我为我的公司实施了类似的东西。

得到教训:

1. you can't just pass IPs around and expect the users to like that over skype.
   Solution:
      a. You will need your own server with the necessary ports forwarded. You will have to use some sort of firewall hole punching algorithm(take a look at UDP hole punching).

2. Using existing VoIP library is always better. Downside? You can't write proprietary code using opensource library. Hence you will need to learn H.323 and RTCP/RTP protocol.

3. You will need to write echo reduction algorithms for voice.

4. COMPRESS your audio data before sending it to another computer. PCM data can and will clog your network, delaying sound and fuzzing up everything in the process.
Use aLaw and uLaw compression schemes.

5. Make sure you take care of all the error conditions. Multimedia over network can be tricky if not really hard to implement. 

6. DONT USE QT. Use a platform specific framework like .NET and libraries that deal with sound (NAudio). 

我认为这将总结您在深入研究 VoIP 编程艺术之前首先需要解决的问题。

对于您的问题,您的问题要小得多。

1. You don't need echo reduction algorithms IF you use headsets.
2. You don't need to write hole punching algorithms if you're OK with passing IPs around. Take a look at NAT traversal(UPnP?) if the data is suppose to go on a network and to a computer that isn't on your LAN.

FLOW:
COMPUTER1->DATABUFFER->COMPRESSuLaw/aLaw->NETWORK->DECOMPRESSuLaw/aLaw->OTHERCOMPUTER
and vice versa.

祝你好运 :)

于 2012-10-23T22:14:30.583 回答
2

我会推荐 PJSIP。 http://www.pjsip.org/

PJSIP 将为您处理 SIP音频。(它也有 STUN!)

我将不得不不同意另一个答案,请使用QT。没有理由在这里“原生”。PJSIP 不仅可以为您处理音频,而且还有许多其他跨平台音频库。

关于传递 IP……如果您打算在 LAN 上使用它,我建议您使用 UDP 广播来发现其他用户(并在 UI 中有一个位置来定义您的用户名,以便最终用户可以识别彼此)。这在 QT 中很容易实现。

于 2012-10-24T01:45:03.177 回答