VoIP RTP Streaming from/to server (in Java) to/from android

You don’t give enough detail about your application. With any UDP streaming application you need to address the following issues:

  • Network Jitter and Buffering: When a packet arrives, you cannot play the audio immediately after you receive it because the next packet might be later than expected and you will have a gap in your audio playback. The variance in the arrival rate is called network jitter. You need to buffer some amount of data before you try to play back. Usually you use some sort of ring buffer.

  • Packet loss: There will be packet losses with UDP. You need to “deal” with this. If you send 10 packets and packet #4 is missing, you can’t play packet #3 then packet #5. It will sound bad. Ways to deal with this:

    • Loss Concealment: Try to minimize the bad effect off a packet lost. You can play silence (although this doesn’t sound the best unless you fade it to silence). You can “estimate” the lost audio by generating a missing audio by examining the surrounding packets.
    • Forward Error Correction: Send packets more than once. There are numerous ways and schemes. The tradeoff is higher latency and more network utilization
  • Out of order arrivals: Packets may arrive out of order. Use the RTP sequence numbers to deal with this.

Audio streaming is not a trivial task. You can’t just open a socket, send data, and play it on the other end and expect it to work. Your biggest concern with UDP streaming is network jitter and packet loss. If you don’t want to deal with losses and you can have some extra latency, use TCP but be sure to buffer up enough audio before you start playing.

Leave a Comment