2010-11-14 85 views
4

我有一些设计问题想与有兴趣帮助我的人讨论。我打算开发一个简单的VoIP程序,允许同一网络中的两部Android手机使用VoIP。我的目标是简单地捕捉声音,使用UDP发送数据,接收UDP数据并播放声音。Android:实施VoIP程序

我目前的设计是有2个线程:一个捕获麦克风并发送数据;另一个接收字节并播放它们。

我开始实施使用MediaPlayer和MediaRecorder。出现的问题是我如何录制和播放声音?因此,我想知道是否需要使用文件,尽管看起来很慢,或者如果有记录会自动发送到我的UDP套接字吗?

基本上,我不知道是否有记录到文件中,然后才能够发挥它,或者,如果我可以只通过一个插槽(用于记录和播放)。

有没有人有任何建议吗?

非常感谢您

+0

你的意思是“在同一网络中的电话”并不是互联网上的所有这些设备? – 2010-11-14 02:05:47

+2

同样的网络,我的意思是它不会离开NAT盒子(例如那些Linksys路由器)。问题在于防火墙:传入的连接将被拒绝,因为它不知道将其转发给哪个设备,并且出于安全原因。出于这个原因,所有设备都将连接到同一台路由器,并且我将手动输入IP地址。 – Jary 2010-11-14 02:17:49

回答

1

MediaRecorder需要一个FD的话,你可以使用套接字为好。我没有看到任何问题。这完全取决于你如何设计你的系统。

+0

当我使用“Socket”类时,我可以将套接字传递给MediaRecorder,但Socket类似乎使用TCP。我一直在尝试使用DatagramSocket和DatagramPacket类,因为它使用UDP,但MediaRecorder不会接受这些类。我使用ParcelFileDescriptor.fromSocket(),但它需要一个Socket,而不是DatagramSocket。请有任何想法吗? – Jary 2010-11-14 18:25:08

1

请勿将这些类用于流式音频 - 请改用AudioTrack和AudioRecord。

它们提供播放和录制原始音频数据所需的功能,而无需处理FD。

当您录制帧(byte []或short [])时,将其包装为一个UDP数据包。 当您收到一个UDP数据包时,解压相关字节[]或短[]并播放它。