docs/webrtc-for-beginners.html
This tutorial is out-dated (written in 2013). Please check this tutorial instead: https://codelabs.developers.google.com/codelabs/webrtc-web/#0
First of all: you need to get access to microphone and camera if you want to build a video streaming app.
var[streamToAttach](#addStream "To allow your friend hear your voice and see you: we will share your microphone and camera.");
navigator. **webkitGetUserMedia** ({ audio: **true** , video: **true** }, function (stream) {
video.src = webkitURL. **createObjectURL** (stream);[streamToAttach](#addStream)= stream;
}, function(error) {
alert(error);
});
var[streamToAttach](#addStream "To allow your friend hear your voice and see you: we will share your microphone and camera.");
navigator. **mozGetUserMedia** ({ audio: **true** , video: **true** }, function (stream) {
video.mozSrcObject = stream;
video.play();[streamToAttach](#addStream)= stream;
}, function(error) {
alert(error);
});
There are following possible situations:
There are so many other possible situations. Let go to the point.
The first situation: a person wants to make an offer request to his friend. He will create offer sdp and send that sdp to his friend.
First of all: we need to open a peer connection:
varpeerConnection= new **webkitRTCPeerConnection** (
{ " **iceServers**": [{ "url": " **stun** :stun.l.google.com:19302" }] }
);
webkitRTCPeerConnection (or mozRTCPeerConnection ) constructor takes two objects (arguments):
For Firefox, you can use this STUN server:
{ " iceServers": [{ "url": " stun :stun.services.mozilla.com" }] }
Setting event handlers for peer connection object:
[peerConnection](#peerConnection). **onicecandidate** =[onicecandidate](#onicecandidate-func);[peerConnection](#peerConnection). **onaddstream** =[onaddstream](#onaddstream-func);[peerConnection](#peerConnection). **addStream** ([streamToAttach](#streamToAttach));
In simple words: onicecandidate returns locally generated ICE candidates so you can pass them over other peer(s) via XHR or Socket.
onaddstream returns remote stream (microphone and camera of your friend!).
peerConnection.addStream attaches your local microphone and camera for other peer.
[peerConnection](#peerConnection). **createOffer** (function (sessionDescription) {[peerConnection](#peerConnection). **setLocalDescription** (sessionDescription);// POST-Offer-SDP-For-Other-Peer(sessionDescription. **sdp** , sessionDescription. **type** );}, function(error) {
alert(error);
}, { ' **mandatory**': { ' **OfferToReceiveAudio**': true, ' **OfferToReceiveVideo**': true } });
Assume that you sent offer sdp to your friend using XHR. Now, "process" that offer sdp and then create answer sdp and send it back to offerer:
[peerConnection](#peerConnection). **setRemoteDescription** (new **RTCSessionDescription** ([offerSDP](#offer-sdp)));
[peerConnection](#peerConnection). **createAnswer** (function (sessionDescription) {[peerConnection](#peerConnection). **setLocalDescription** (sessionDescription);// POST-answer-SDP-back-to-Offerer(sessionDescription. **sdp** , sessionDescription. **type** );}, function(error) {
alert(error);
}, { ' **mandatory**': { ' **OfferToReceiveAudio**': true, ' **OfferToReceiveVideo**': true } });
Offerer received answer sdp from answerer
[peerConnection](#peerConnection). **setRemoteDescription** (new **RTCSessionDescription** ([answerSDP](#answer-sdp)));
Offer/Answer exchange is done. What remaining is ICE candidates.
function[onicecandidate](#onicecandidate)(event) {
if (! [peerConnection](#peerConnection)|| !event || !event.candidate) return;
var candidate = event. **candidate** ;// POST-ICE-to-other-Peer(candidate. **candidate** , candidate. **sdpMLineIndex** );}
[peerConnection](#peerConnection). **addIceCandidate** (new **RTCIceCandidate** ({ **sdpMLineIndex** : candidate. **sdpMLineIndex** , **candidate** : candidate. **candidate** }));
function[onaddstream](#onaddstream)(event) {
if (!event) return;
remote_video.src = webkitURL. **createObjectURL** (event. **stream** );
// remote_video.mozSrcObject = event. **stream** ;
}
function[onaddstream](#onaddstream)(event) {
if (!event) return;
remote_video.src = webkitURL. **createObjectURL** (event. **stream** );
// remote_video.mozSrcObject = event. **stream** ;[waitUntilRemoteStreamStartsFlowing](#waitUntilRemoteStreamStartsFlowing)();
}
function **waitUntilRemoteStreamStartsFlowing** ()
{
if (!(remote_video. **readyState** <= HTMLMediaElement. **HAVE\_CURRENT\_DATA** || remote_video. **paused** || remote_video. **currentTime** <= 0))
{// remote stream started flowing!}
else **setTimeout** ([waitUntilRemoteStreamStartsFlowing](#waitUntilRemoteStreamStartsFlowing), 50);
}
Send MessageEnter your email too; if you want "direct" reply!