Tim Panton
@steely_glint
PUTTING THE WEB INTO
WEBRTC
 Protocol Droid
 Webrtc fan -
 Standards pusher
 Doing my own thing with IOT
 Some consulting
ABOUT: TIM PANTON
@steely_glint - Westhawk Ltd
CHANGE IS COMING
 1905
 Newtonian Physics
 All wrapped up
 Almost…. ->
 Photoelectric effect
 Quantum view of universe
 New possibilities
 WebRTC is like that.
 Changes communications
baseline
 Adding P2P security +context
@steely_glint - Westhawk Ltd
 Pay per min for calls
THE OLD WAY
@steely_glint - Westhawk Ltd
 Twillio will do 1bn webrtc minutes this year
 Most of them in apps like Uber and twiddla
 It is still communication – but in context
 Context first – call second
NOT JUST ‘CALLS’ ANY MORE
@steely_glint - Westhawk Ltd
Don’t underestimate Javascript
Combine
 Cookies/context
 WebGL
 WebAudio
 WebRTC
WEB TOOLS
@steely_glint - Westhawk Ltd
 Setting up a call is about establishing a shared context
 Who am I?
 Who can call who?
 Do you want to speak to me?
 Login + cookies is one way – but there are others
 Text ‘upgrade’ is defacto now.
URLs:
https://appear.in/steely_glint
But that didn’t work for my video-call-my-parrot app.
(YoPet)
CONTEXT
@steely_glint - Westhawk Ltd
 Video effects in high level language
 Realtime
 Built into browser
Examples:
http://seriouslyjs.org/ - real time green-screen in your browser!
http://www.html5rocks.com/en/tutorials/webgl/jsartoolkit_we
brtc/AR_mediaStream.html - magic AR
Can also be applied to remote video streams.
WEBGL
@steely_glint - Westhawk Ltd
 Use video to
 Exchange a token
 Out of band
 Save it
 Proximity based pairing – like bluetooth but easier
 Useful for ‘things’ without a usable keyboard
 Filed a patent on Token choice
(See IIT talk for details)
 Untrusted (federated) middleman.
YOPET DEMO
@steely_glint - Westhawk Ltd
 Late 80’s synth in your browser (https://www.flickr.com/photos/gmacklin/)
WEBAUDIO
@steely_glint - Westhawk Ltd
 http://webaudiodemos.appspot.com/midi-synth/index.html
 https://forestmist.org/share/web-audio-api-demo
LITERALLY
@steely_glint - Westhawk Ltd
 WebAudio + WebRTC
 Chrome supports outbound webRTC streams from WebAudio
 Firefox >=39 supports both directions
 Process your audio before sending it (chrome)
 Filter, delay, fft, convolve
 Combine effects to pitch shift
 Display spectrum
 Arbitrary maths in webworker
 In Firefox you can do the same on the inbound side too
SO WHAT?
@steely_glint - Westhawk Ltd
 No longer need to talk to yourself
 Press a button to inject audio
 No EC or ACG in the way
 Test code only – not production
w i n d o w . w i r e . a p p . r e p o s i t o r y . c a l l . i n j e c t _ a u d i o _ i n t o _ c a l l ( w i r e . a p p . r e p o s i t o r y . c o n v e r s a t i o n . a c t i v e _ c o n v e r s a t i o n ( ) . i d ,
” a u d i o / r e a d y _ t o _ t a l k . m p 3 " )
EXAMPLE – INJECT TEST AUDIO
@steely_glint - Westhawk Ltd
_wrap_local_stream: (stream) =>
wrap_stream = stream
#should test for audio stream type here...
@contex = new window.AudioContext()
@localsource = @context.createMediaStreamSource stream
@localdest = @audio_context.createMediaStreamDestination()
@addeffects()
wrap_stream = @local_audio_dest.stream
return wrap_stream
CODE
@steely_glint - Westhawk Ltd
_suck_in_audio_file: =>
AUDIO_PATH = 'ext/audio/webapp-audio/'
knock_url = "#{AUDIO_PATH}ready_to_talk.mp3"
request = new XMLHttpRequest()
request.open('GET', knock_url, true)
request.responseType = 'arraybuffer'
request.onload = =>
load = (buffer) =>
@knock_audio_buffer = buffer
@logger.log "Loaded audio from #{knock_url}"
fail = =>
@logger.log "Failed to load audio from #{knock_url}"
@audio_context.decodeAudioData request.response, load , fail
request.send();
CODE
@steely_glint - Westhawk Ltd
send_audio_file: =>
# we unhook the mic , play our audio , then reconnect
if @knock_audio_buffer isnt undefined
knock_source = @audio_context.createBufferSource()
knock_source.buffer = @knock_audio_buffer
@local_audio_source.disconnect()
knock_source.connect(@local_audio_dest)
knock_source.onended = =>
@logger.log 'finished knock sound'
knock_source.disconnect(@local_audio_dest)
@_hookup_audio()
@logger.log 'play knock sound'
knock_source.start();
CODE
@steely_glint - Westhawk Ltd
_wrap_remote_stream: (stream) =>
wrap_stream = stream
if @context isnt undefined
#only works in ffox >= 39
@remote_source = @context.createMediaStreamSource
stream
@remote_dest = @context.createMediaStreamDestination()
@remote_audio_source.connect(@remote_audio_dest)
@add_effects2()
wrap_stream = @remote_audio_dest.stream
@logger.log 'Wrapped remote audio stream'
return wrap_stream
CODE
@steely_glint - Westhawk Ltd
 Firefox debug screen
 Various plugboards
 Volume meter
IF YOU LIKE GRAPHICS
@steely_glint - Westhawk Ltd
 Use WebAudio to Inject Audio
 Acoustically couple to test device
 Compare returning stream from DUT
 Measure latency from differences
 Tests Audio and network path
 in Firefox nightly
LATENCY MEASUREMENT
@steely_glint - Westhawk Ltd
 Use WebAudio to do IVR
 Do the automated part locally
 Only connect when actually need agent
 Higher quality audio
 More network resilient
 Much less dialplan?
(use 1m web devs?)
LONGER TERM
@steely_glint - Westhawk Ltd
 Web Browser has rich APIs
 Use them to delight your user
 To make your life easier
 Or both!
 thp@westhawk.co.uk
 @steely_glint
 (thanks to wire.com for examples in this talk)
SUMMARY
@steely_glint - Westhawk Ltd

Putting the 'web' into webRTC

  • 1.
  • 2.
     Protocol Droid Webrtc fan -  Standards pusher  Doing my own thing with IOT  Some consulting ABOUT: TIM PANTON @steely_glint - Westhawk Ltd
  • 3.
    CHANGE IS COMING 1905  Newtonian Physics  All wrapped up  Almost…. ->  Photoelectric effect  Quantum view of universe  New possibilities  WebRTC is like that.  Changes communications baseline  Adding P2P security +context @steely_glint - Westhawk Ltd
  • 4.
     Pay permin for calls THE OLD WAY @steely_glint - Westhawk Ltd
  • 5.
     Twillio willdo 1bn webrtc minutes this year  Most of them in apps like Uber and twiddla  It is still communication – but in context  Context first – call second NOT JUST ‘CALLS’ ANY MORE @steely_glint - Westhawk Ltd
  • 6.
    Don’t underestimate Javascript Combine Cookies/context  WebGL  WebAudio  WebRTC WEB TOOLS @steely_glint - Westhawk Ltd
  • 7.
     Setting upa call is about establishing a shared context  Who am I?  Who can call who?  Do you want to speak to me?  Login + cookies is one way – but there are others  Text ‘upgrade’ is defacto now. URLs: https://appear.in/steely_glint But that didn’t work for my video-call-my-parrot app. (YoPet) CONTEXT @steely_glint - Westhawk Ltd
  • 8.
     Video effectsin high level language  Realtime  Built into browser Examples: http://seriouslyjs.org/ - real time green-screen in your browser! http://www.html5rocks.com/en/tutorials/webgl/jsartoolkit_we brtc/AR_mediaStream.html - magic AR Can also be applied to remote video streams. WEBGL @steely_glint - Westhawk Ltd
  • 9.
     Use videoto  Exchange a token  Out of band  Save it  Proximity based pairing – like bluetooth but easier  Useful for ‘things’ without a usable keyboard  Filed a patent on Token choice (See IIT talk for details)  Untrusted (federated) middleman. YOPET DEMO @steely_glint - Westhawk Ltd
  • 10.
     Late 80’ssynth in your browser (https://www.flickr.com/photos/gmacklin/) WEBAUDIO @steely_glint - Westhawk Ltd
  • 11.
  • 12.
     WebAudio +WebRTC  Chrome supports outbound webRTC streams from WebAudio  Firefox >=39 supports both directions  Process your audio before sending it (chrome)  Filter, delay, fft, convolve  Combine effects to pitch shift  Display spectrum  Arbitrary maths in webworker  In Firefox you can do the same on the inbound side too SO WHAT? @steely_glint - Westhawk Ltd
  • 13.
     No longerneed to talk to yourself  Press a button to inject audio  No EC or ACG in the way  Test code only – not production w i n d o w . w i r e . a p p . r e p o s i t o r y . c a l l . i n j e c t _ a u d i o _ i n t o _ c a l l ( w i r e . a p p . r e p o s i t o r y . c o n v e r s a t i o n . a c t i v e _ c o n v e r s a t i o n ( ) . i d , ” a u d i o / r e a d y _ t o _ t a l k . m p 3 " ) EXAMPLE – INJECT TEST AUDIO @steely_glint - Westhawk Ltd
  • 14.
    _wrap_local_stream: (stream) => wrap_stream= stream #should test for audio stream type here... @contex = new window.AudioContext() @localsource = @context.createMediaStreamSource stream @localdest = @audio_context.createMediaStreamDestination() @addeffects() wrap_stream = @local_audio_dest.stream return wrap_stream CODE @steely_glint - Westhawk Ltd
  • 15.
    _suck_in_audio_file: => AUDIO_PATH ='ext/audio/webapp-audio/' knock_url = "#{AUDIO_PATH}ready_to_talk.mp3" request = new XMLHttpRequest() request.open('GET', knock_url, true) request.responseType = 'arraybuffer' request.onload = => load = (buffer) => @knock_audio_buffer = buffer @logger.log "Loaded audio from #{knock_url}" fail = => @logger.log "Failed to load audio from #{knock_url}" @audio_context.decodeAudioData request.response, load , fail request.send(); CODE @steely_glint - Westhawk Ltd
  • 16.
    send_audio_file: => # weunhook the mic , play our audio , then reconnect if @knock_audio_buffer isnt undefined knock_source = @audio_context.createBufferSource() knock_source.buffer = @knock_audio_buffer @local_audio_source.disconnect() knock_source.connect(@local_audio_dest) knock_source.onended = => @logger.log 'finished knock sound' knock_source.disconnect(@local_audio_dest) @_hookup_audio() @logger.log 'play knock sound' knock_source.start(); CODE @steely_glint - Westhawk Ltd
  • 17.
    _wrap_remote_stream: (stream) => wrap_stream= stream if @context isnt undefined #only works in ffox >= 39 @remote_source = @context.createMediaStreamSource stream @remote_dest = @context.createMediaStreamDestination() @remote_audio_source.connect(@remote_audio_dest) @add_effects2() wrap_stream = @remote_audio_dest.stream @logger.log 'Wrapped remote audio stream' return wrap_stream CODE @steely_glint - Westhawk Ltd
  • 18.
     Firefox debugscreen  Various plugboards  Volume meter IF YOU LIKE GRAPHICS @steely_glint - Westhawk Ltd
  • 19.
     Use WebAudioto Inject Audio  Acoustically couple to test device  Compare returning stream from DUT  Measure latency from differences  Tests Audio and network path  in Firefox nightly LATENCY MEASUREMENT @steely_glint - Westhawk Ltd
  • 20.
     Use WebAudioto do IVR  Do the automated part locally  Only connect when actually need agent  Higher quality audio  More network resilient  Much less dialplan? (use 1m web devs?) LONGER TERM @steely_glint - Westhawk Ltd
  • 21.
     Web Browserhas rich APIs  Use them to delight your user  To make your life easier  Or both!  thp@westhawk.co.uk  @steely_glint  (thanks to wire.com for examples in this talk) SUMMARY @steely_glint - Westhawk Ltd