Are You Using AppRTC as Your WebRTC Baseline Reference?

February 8, 2016

If you aren’t using AppRTC yet then you should start.


I had a few customers last month who had quality issues with their service. They were trying to understand the root cause of these issues, and at times, the question raised was “is WebRTC up for the task?”

  • Does the poor audio quality we experience in our service derive from the codec, the browser’s implementation or something in our own backend?
  • Are the video stutters stem from heavy packet loss and that’s just life – or are we adding some of our own issues into the mix?
  • The average bitrate we reach in a call. Is it because the browser is limiting us? Is it because the connection is bad? Is it…

The list goes on.

The fact that now you get a fully implemented media engine in the browser for free is great. The problem is, it gives you (or your developers) the opportunity to blame the browser: It isn’t us. Google’s engineers did such a crap job with X that we just can’t fix it.

More often than not – this won’t be the problem.

When in doubt – check AppRTC

Google launched AppRTC quite some time ago.

AppRTC is Google’s way of showcasing WebRTC in their simplest version of the “Hello World” program. This being WebRTC, there are many moving parts, but to some extent, AppRTC is rather baseline – especially in its dealings with media.

This makes AppRTC a great baseline reference when you have issues with the media paths of your own service or just want something to compare it with.

Got an issue? Test what happens when you run AppRTC and compare it with your own service. If you see that your service isn’t performing in the same manner, chances are the problem is on your end – and now you can start diverting focus and resources towards searching the problem instead of blaming the browser.

Where to look for the problems?

  • Your NAT traversal servers, if they are being used
  • Are you doing any backend processing for the media? Map your pipeline there. Check each step of that pipeline to see if it is to blame
  • Transcoding never fails to fail you – check there if you use it
  • Jitter buffers are notoriously… jittery. Make sure the implementation fits your use case
  • Network routes and handling dynamic bitrates and packet losses might be handled nicely by the browser, but is your backend up for the task as well?

Don’t forget either

Google has another great analysis tool –

You open the settings, insert your own STUN and TURN server configuration – and start the test.

It will then check the system and network connections to give you a nice view of what the browser is experiencing – something you can later use to understand the environment you operate in.

Why is this important?

With WebRTC, it is easy for developers to blame the browser. This isn’t productive.

Your first task should be to create a baseline reference you can trust. One that enables isolating the issues you are experiencing systematically.

AppRTC is a good place to start.

You may also like

WebRTC predictions for 2023

WebRTC predictions for 2023

Your email address will not be published. Required fields are marked

  1. Also note that has a bunch of useful parameters you can to help provide your own TURN server, adjust getUserMedia constraints, and more. Some of them are listed here:

    There are a bunch more if you scan through the source code:

    Don’t forget to hit “i” when you’re in to get valuable stats information.

  2. Hello.
    My name is João Bosco.
    I’m developing a project for FioCruz (the most important research organization in Brazil) and I need to use Teletendimento and, studying appRTC, I think it can be useful.
    How do I purchase it? I am Brazilian and I live in Belo Horizonte, in the state of Minas Gerais.
    Would someone like to contact me?
    I don’t speak English correctly. I am using the google translator to be here communicating with you.
    My email is [email protected].
    My whatsApp is 05531995047370

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}