2013-07-17 80 views
0

基本想法是创建一个应用程序,该应用程序可以记录来自一台设备的音频,并通过套接字将其通过Wlan发送到将播放该设备的其他设备。简而言之,一个Lan语音聊天程序。Android:使用AudioTrack和套接字手动流式传输音频

我使用AudioRecord对象从麦克风录制实时音频,然后将录制的数据读入字节数组,然后将字节数组写入TCP套接字。接收设备然后从套接字读取该字节数组并将其写入到AudioTrack对象的缓冲区中。

其像

音频记录 - >字节数组 - >插座---> LAN --->插座 - >字节数组 - > AudioTrack

的进程正在使用的同时反复循环。

虽然音频在播放其帧之间的滞后。即当我说你好接收者听到他 - ll - O。虽然音频已完成,但缓冲区块之间存在滞后。

据我知道的滞后是由于在局域网传输

耽误我怎样改进呢? 我应该使用什么方法,以便在商业在线聊天应用程序(如skype和gtalk)中平滑使用?

回答

0

听起来就像你需要一个更长的缓冲区来处理局域网上音频传输的变化。为了解决这个问题,你可以在套接字字节数组和音轨之间创建一个中间缓冲区。您的缓冲区可以是AudioTrack对象中使用的缓冲区大小的x倍。因此,像这样:

插座字节 - >音频缓冲 - >缓冲区得到送入音轨 - >音频轨道

当音频开始记录,不玩任何东西,直到它完全填满的时间越长缓冲。之后,您可以将音频轨道缓冲区大小的块传送到您的音频轨道对象。

+0

但是不会缓冲开始减少,因为音频将以比它到达的速度更大的速率进行供给 – Allahjane

+0

随着缓冲区显示较晚,缓冲区将会减少。但是,也应该填补作为晚期终于到达。需要考虑的一件事就是将缓冲区提交到网络的时间与录制音频的采样率对齐。另一件需要考虑的事情是,你可能无法获得缓冲区。因此,在播放音频到接收器之前的延迟应该足够慷慨,以便有时间处理。 – Ehz