{"json_modified": "2016-10-25T11:11:35.767437", "uuid": "f270143a-2ce5-4304-88b0-30ae12a8eb90", "title": "Signaling and video calling", "url": "/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling", "tags": ["API", "WebRTC", "Guide", "Signaling", "Audio", "Video", "Example", "Tutorial", "video", "Media", "audio"], "translations": [], "modified": "2016-10-25T11:11:35", "label": "Signaling and video calling", "localization_tags": [], "locale": "en-US", "id": 166637, "last_edit": "2016-10-25T11:11:13", "summary": "Although WebRTC is billed as a fully peer-to-peer technology for the real-time exchange of audio, video, and data, there is one caveat. As discussed elsewhere, in order for two devices on different networks to locate one another, some form of discovery and media format negotiation must take place. This process, called signaling, involves both devices connecting to a third, mutually agreed-upon server through which the two devices can locate one another and exchange the needed negotiation messages.", "sections": [{"id": "Quick_Links", "title": null}, {"id": "The_signaling_server", "title": "The signaling server"}, {"id": "Readying_the_chat_server_for_signaling", "title": "Readying the chat server for signaling"}, {"id": "Designing_the_signaling_protocol", "title": "Designing the signaling protocol"}, {"id": "Exchanging_session_descriptions", "title": "Exchanging session descriptions"}, {"id": "Exchanging_ICE_candidates", "title": "Exchanging ICE candidates"}, {"id": "Signaling_transaction_flow", "title": "Signaling transaction flow"}, {"id": "ICE_candidate_exchange_process", "title": "ICE candidate exchange process"}, {"id": "The_client_application", "title": "The client application"}, {"id": "Updating_the_HTML", "title": "Updating the HTML"}, {"id": "The_JavaScript_code", "title": "The JavaScript code"}, {"id": "Sending_messages_to_the_signaling_server", "title": "Sending messages to the signaling server"}, {"id": "UI_to_start_a_call", "title": "UI to start a call"}, {"id": "Starting_a_call", "title": "Starting a call"}, {"id": "Handling_getUserMedia()_errors", "title": "Handling getUserMedia() errors"}, {"id": "Creating_the_peer_connection", "title": "Creating the peer connection"}, {"id": "Set_up_event_handlers", "title": "Set up event handlers"}, {"id": "Starting_negotiation", "title": "Starting negotiation"}, {"id": "Session_negotiation", "title": "Session negotiation"}, {"id": "Handling_the_invitation", "title": "Handling the invitation"}, {"id": "Sending_ICE_candidates", "title": "Sending ICE candidates"}, {"id": "Receiving_ICE_candidates", "title": "Receiving ICE candidates"}, {"id": "Receiving_new_streams", "title": "Receiving new streams"}, {"id": "Handling_the_removal_of_streams", "title": "Handling the removal of streams"}, {"id": "Ending_the_call", "title": "Ending the call"}, {"id": "Hanging_up", "title": "Hanging up"}, {"id": "Ending_the_call_2", "title": "Ending the call"}, {"id": "Dealing_with_state_changes", "title": "Dealing with state changes"}, {"id": "ICE_connection_state", "title": "ICE connection state"}, {"id": "ICE_signaling_state", "title": "ICE signaling state"}, {"id": "ICE_gathering_state", "title": "ICE gathering state"}, {"id": "Next_steps", "title": "Next steps"}], "slug": "Web/API/WebRTC_API/Signaling_and_video_calling", "review_tags": ["editorial"]}