×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
YOU'RE ON MUTE! WEBRTC AND OUR LIVES ON SCREEN @philnash
Slide 2
Slide 2 text
Phil Nash @philnash https://philna.sh
[email protected]
Slide 3
Slide 3 text
YOU'RE ON MUTE! WEBRTC AND OUR LIVES ON SCREEN @philnash
Slide 4
Slide 4 text
OUR LIVES ON SCREEN @philnash
Slide 5
Slide 5 text
WEBRTC VS @philnash
Slide 6
Slide 6 text
GREAT FOR WORK, FRIENDS OR FAMILY @philnash
Slide 7
Slide 7 text
NOT SO GREAT FOR ONE OFFS @philnash
Slide 8
Slide 8 text
NOT SO GREAT FOR SPECIALIST APPS @philnash
Slide 9
Slide 9 text
WEBRTC IS FOR ALL THE OTHER APPLICATIONS @philnash
Slide 10
Slide 10 text
REAL-TIME VIDEO, AUDIO AND DATA EXPERIENCES FOR YOUR USERS @philnash
Slide 11
Slide 11 text
Today 1. Basics of WebRTC 2. WebRTC Usage 3. Controlling the user experience 4. Tools and takeaways @philnash
Slide 12
Slide 12 text
BASICS OF WEBRTC @philnash
Slide 13
Slide 13 text
@philnash
Slide 14
Slide 14 text
Signalling @philnash
Slide 15
Slide 15 text
Peer to peer @philnash
Slide 16
Slide 16 text
SFU @philnash
Slide 17
Slide 17 text
ICE • ICE — Interactive Connectivity Establishment • NAT — Network Address Translation • STUN — Session Traversal Utilities for NAT • TURN — Traversal Using Relays around NAT @philnash
Slide 18
Slide 18 text
THE APIS @philnash
Slide 19
Slide 19 text
getUserMedia navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(stream => { // ... }); 01. 02. 03. 04. @philnash
Slide 20
Slide 20 text
RTCPeerConnection const pc = new RTCPeerConnection({ iceServers }); pc.addEventListener("icecandidate", (candidate) => { // send candidate to signalling }); 01. 02. 03. 04. @philnash
Slide 21
Slide 21 text
RTCPeerConnection pc.addStream(stream); pc.createOffer().then(offer => { pc.setLocalDescription(offer); // send offer to peer }); 01. 02. 03. 04. 05. @philnash
Slide 22
Slide 22 text
RTCPeerConnection pc.setRemoteDescription(offer); pc.createAnswer().then(answer => { pc.setLocalDescription(answer); // send answer to peer }); 01. 02. 03. 04. 05. @philnash
Slide 23
Slide 23 text
RTCPeerConnection pc.setRemoteDescription(answer); pc.addEventListener("track", event => { // Connected! // show remote video in UI }); 01. 02. 03. 04. 05. @philnash
Slide 24
Slide 24 text
RTCDataChannel const dataChannel = pc.createDataChannel("my-data-channel"); dataChannel.addEventListener("message", event => { console.log(event.data); }); 01. 02. 03. 04. @philnash
Slide 25
Slide 25 text
RTCDataChannel pc.addEventListener("datachannel", event => { event.channel.addEventListener("open", () => { event.channel.send("Hi!"); }); }); 01. 02. 03. 04. 05. @philnash
Slide 26
Slide 26 text
WEBRTC USAGE @philnash
Slide 27
Slide 27 text
@philnash
Slide 28
Slide 28 text
@philnash
Slide 29
Slide 29 text
IMPROVING THE USER EXPERIENCE @philnash
Slide 30
Slide 30 text
MEDIA @philnash
Slide 31
Slide 31 text
getUserMedia navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(stream => { // ... }); 01. 02. 03. 04. @philnash
Slide 32
Slide 32 text
getUserMedia - Permissions navigator.mediaDevices.getUserMedia({ audio: true, video: true }) .then(stream => { // success }) .catch(error => { // permission denied }); 01. 02. 03. 04. 05. 06. @philnash
Slide 33
Slide 33 text
getUserMedia - Media Constraints { audio: true, video: true } 01. 02. 03. 04. @philnash
Slide 34
Slide 34 text
Media Constraints - facingMode { audio: true, video: { facingMode: "user" // "environment", "right", "left" } } 01. 02. 03. 04. 05. 06. @philnash
Slide 35
Slide 35 text
Media Constraints - deviceId { audio: true, video: { deviceId: { exact: device.id } } } 01. 02. 03. 04. 05. 06. @philnash
Slide 36
Slide 36 text
enumerateDevices navigator.mediaDevices.enumerateDevices() .then(devices => { devices.forEach(device => { console.log(`${device.id}: ${device.label}`); }); }); 01. 02. 03. 04. 05. 06. @philnash
Slide 37
Slide 37 text
enumerateDevices - Permissions navigator.mediaDevices.enumerateDevices() .then(devices => { devices.forEach(device => { console.log(device.label); // ??? }); }); 01. 02. 03. 04. 05. 06. @philnash
Slide 38
Slide 38 text
Media Constraints - resolution { audio: true, video: { width: 1920, height: 1080 } } 01. 02. 03. 04. 05. 06. 07. @philnash
Slide 39
Slide 39 text
Media Constraints - resolution { video: { width: { min: 320, max: 1920, ideal: 1920 }, height: { min: 240, max: 1080, ideal: 1080 } } } 01. 02. 03. 04. 05. 06. @philnash
Slide 40
Slide 40 text
Media Constraints - resolution { video: { width: { exact: 1920 }, height: { exact: 1080 } } } // => 🚨 OverconstrainedError 01. 02. 03. 04. 05. 06. 07. @philnash
Slide 41
Slide 41 text
Media Constraints - torch 🔦😄 { video: { advanced: [{ torch: true }], } } 01. 02. 03. 04. 05. @philnash
Slide 42
Slide 42 text
Media Constraints - torch 🔦😄 { video: { advanced: [{ torch: false }], // doesn't work 🤨 } } 01. 02. 03. 04. 05. @philnash
Slide 43
Slide 43 text
Applying media constraints videoTrack.applyConstraints({ width: 1920, height: 1080 }); 01. 02. 03. 04. @philnash
Slide 44
Slide 44 text
Applying media constraints videoTrack.applyConstraints({ deviceId: { exact: device.id } }); ❌ Don't do this! ❌ 01. 02. 03. @philnash
Slide 45
Slide 45 text
Changing cameras videoTrack.stop(); navigator.mediaDevices.getUserMedia({ video: { deviceId: { exact: device.id } } }); 01. 02. 03. 04. 05. 06. @philnash
Slide 46
Slide 46 text
DEMO @philnash
Slide 47
Slide 47 text
RECOMMENDATION: ALWAYS PROVIDE A WAY TO CHECK AND CHANGE INPUTS @philnash
Slide 48
Slide 48 text
RECOMMENDATION: UNDERSTAND THE AVAILABLE MEDIA CONSTRAINTS @philnash
Slide 49
Slide 49 text
SCREEN SHARE @philnash
Slide 50
Slide 50 text
Screen share navigator.mediaDevices.getDisplayMedia() .then(stream => { // add stream track to peer connection }) 01. 02. 03. 04. @philnash
Slide 51
Slide 51 text
DEMO @philnash
Slide 52
Slide 52 text
RECOMMENDATION: LET PEOPLE SHARE SCREENS WITHOUT AN EXTENSION @philnash
Slide 53
Slide 53 text
WEB AUDIO API @philnash
Slide 54
Slide 54 text
Web Audio API Not part of WebRTC Vital part of displaying audio to the user @philnash
Slide 55
Slide 55 text
DEMO @philnash
Slide 56
Slide 56 text
YOU'RE ON MUTE! @philnash
Slide 57
Slide 57 text
DEMO @philnash
Slide 58
Slide 58 text
DATA CHANNEL @philnash
Slide 59
Slide 59 text
RTCDataChannel const dataChannel = pc.createDataChannel("my-data-channel"); dataChannel.addEventListener("message", event => { console.log(event.data); }); dataChannel.send("Hi!"); 01. 02. 03. 04. 05. @philnash
Slide 60
Slide 60 text
DEMO @philnash
Slide 61
Slide 61 text
USEFUL TOOLS @philnash
Slide 62
Slide 62 text
OPEN SOURCE DIAGNOSTICS @philnash
Slide 63
Slide 63 text
DEMO @philnash
Slide 64
Slide 64 text
RTC Diagnostics https://github.com/twilio/rtc-diagnostics/ @philnash
Slide 65
Slide 65 text
OUR LIVES ON SCREEN @philnash
Slide 66
Slide 66 text
WEBRTC IS EVERYWHERE @philnash
Slide 67
Slide 67 text
WEBRTC IS POWERFUL BECAUSE IT IS ON THE WEB @philnash
Slide 68
Slide 68 text
WE HAVE THE TOOLS TO BUILD GREAT WEBRTC EXPERIENCES @philnash
Slide 69
Slide 69 text
Thanks! @philnash https://philna.sh
[email protected]