RakNet--RakVoice

Jenkins Software

RakVoice

实时语音通信

       RakVoiceRakNet的一个特色,这个插件可以实现实时语音通信,在8000 16 bit per sec的采样标准下,通信代价仅仅是每秒2200字节数据。这个插件使用Speex来进行语音的编码。RakVoice是一个插件类,使得编码,发送,解码和播放音频数据更加简单。

       得到RakVoice实例,仅仅需要使用new分配对象,或者声明全局对象,更加容易处理。

   

    RakVoice rakVoice;

 

 

       因为RakVoice是一个插件,你需要将它附加到RakPeer对象上。

  

     rakPeer->AttachPlugin( &rakVoice);

 

 

       使用采样频率和处理缓存的大小来初始化这个类。如果采样频率使用8000hz 512字节的缓存比较合适。缓存大小是编码时使用的缓存字节数,以及解码器返回的字节数。这个值通常是你想要锁定声音缓存的值。编码将数据报的数据减少大约75%

      

 rakVoice.Init( 8000, 512);

 

 

       当数据从麦克进入语音缓存时,你应该调用SendFrame函数,要传递接收者系统的SystemAddress值,以及要编码的缓存的指针。与普通的发送API调用不同,你不能对音频数据报进行广播,因为每一个编码器和解码器都是配对的。因此,你必须指定SystemAddress,这样发送方知道使用哪个编码器。要进行广播,需要将数据分别发送给不同的接收方。注意输入缓存的大小必须与前面我们设置的缓存大小匹配。例如:

    

   rakVoice->SendFrame( recipientSystemAddress, (char *) inputBuffer);

 

 

       在其他的系统,数据到达时,依据你使用的声音引擎,你可能使用的是循环音频缓存,需要使用从RakVoice接收到的数据填充这些缓存。每一次播放引擎需要数据播放,应该调用ReceiveFrame()方法获得音频数据。这个方法会在传递的指针处写声音缓存,或者如没有新数据可以使用,则不播放声音。再提醒一次,记住返回的数据要与你在Init中设置的大小相同。

     

  rakVoice.ReceiveFrame((char *)outbuffer);

 

       最后要注意的一点是RakVoice要求在聊天会话中的所有的客户端都能够感知到所有其他的客户端的连接状态。原因如下:

       1. 你需要使用指定的接收方调用SendFrame函数来广播数据。

       2. 你可能想要调用CloseVoiceChannel()方法来停止与指定系统的通信。

       RakVoice仅仅提供了一个方法编码和解码原始音频数据,以及与网络通信的方法。它并没有包含播放或录制声音的机制。然而,两个例子介绍了如何集成声音引擎:

       \Samples\RakVoiceFMOD – 提供了一个将RakVoice与流行的FMOD声音引擎结合的例子。

       \Samples\RakVoice – 如何将RakVoice与免费开源的PortAudio结合使用的例子。

 

       PortAudioSpeex源代码在RakNet中都有,在RakNet根目录下都可以找到,以备用户重新编译用于其他的平台。这些是独立于RakNet的开源APIs,这些源码即不属于我,我也对此不进行维护。请参考他们各自的网页获得更多参考消息,以及他们的使用license

See Also

 

Index
posted @ 2012-09-16 23:18  杂草  阅读(368)  评论(1编辑  收藏  举报