In this article I will setup Android WebRTC streaming to RPI-WebRTC-Streamer running on my Raspberry PI Zero W, to talk to each other.
Here is the architecture of RPI-WebRTC-Streamer.
Now why do we use WebRTC instead of directly streaming audio/video through a socket from the Raspberry PI to the Android device ?
It is helpful to understand how WebRTC works under the hood and how a connection is established.
The magic in WebRTC is the probing of the connection to allow two clients to talk P2P ( Peer-to-Peer ), even if they are behind a firewall or using NAT. There are plenty of online resources devoted to this complex topic ( E.g. https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/ )
The basic steps in establishing a WebRTC connection are:
- Step 1: Signaling: both peers connect to a signaling server (using websockets over 80/443, comet, SIP,etc..) and exchange information (about their media capabilities, public IP:port pairs when they become available, etc.)
- Step 2: Discovery: Devices connected to LAN or mobile networks are not aware of their public IP (and port) where they can be reached at so they use STUN servers located on the public Internet to discover their ip:port pair (ICE candidates). In the process they punch a hole through the NAT/router which is used in step3:
- Step 3: P2P connection: once the ICE candidates are exchanged through the initial signaling channel each peer is aware of each other’s ip:port (and holes have been punched in NATs/routers) so a peer to peer UDP connection can be established.
- Step 4: If a P2P connection can’t be established ( maybe through firewall rules or the usage of Symmetric NAT ) then TURN servers can be used, which will relay the data between the peers. Please note that this will require the TURN server to receive and send all video and audio and is the last resort in WebRTC.
Under normal circumstances you would establish the connection between two web-browser. However in this case I need to establish Android WebRTC streaming to the Raspberry PI Zero W. Fortunately we have the required tools and libraries available on both platforms and can take full advantage of this technology stack. This allows us to basically build a video conference similar to skype between the Raspberry PI and Android. As an aside, iOS can also handle WebRTC, which may be a project for later.
Android WebRTC Streaming:
- Lets first make sure you have the RPI WebRTC Streamer setup, as explained in my previous post.
- Then you have to install ADB onto your computer to be able to transfer the App to your Android phone.
- Connect your Android phone to your computer and make sure you have the developer option enabled
- Next get the source code for RPI WebRTC Streamer from github and install it onto your phone, like so.
bash> git clone https://github.com/kclyu/rpi-webrtc-streamer.git bash> cd rpi-webrtc-streamer/misc bash> adb install AppRTCMobile.apk
- Next open the app on your Android phone
- Change settings of the Video encoder to H264 High
- Change the resolution to VGA(640 x 480)
- And then simply enter the IP address of your raspberry PI as the room number
Finally, here is the article from mpromonet if you ever feel like compiling rpi-webrtc-streamer https://www.raspberrypi.org/forums/viewtopic.php?t=186271.
You can even use docker containers to make things easier: https://hub.docker.com/r/mpromonet/webrtc-streamer/
As an aside, I found multiple Android app templates to use WebRTC