SlideShare una empresa de Scribd logo
WebRTC
    Comunicaciones en tiempo real desde tu navegador

    Javier Cerviño        Alvaro Alonso       Pedro Rodriguez
jcervino@dit.upm.es   aalonsog@dit.upm.es    prodriguez@dit.upm.es
       @jcague        @larsonalonso                @lodoyun


            Nestor Toribio          Joaquín Salvachúa
     nestortoribioruiz@gmail.com      jsr@dit.upm.es
               @nehko1                  @jsalvachua


                                Grupo de Internet de Nueva Generación
                           Departamento de Ingeniería de Sistemas Telemáticos
                                   Universidad Politécnica de Madrid
Previously on GING
Isabel 1995 (o por ahi)
     Aplicación de escritorio
     Ubuntu/Windows
     P2P/Centralizado
     Pasarelas SIP


Marte 2007
     Aplicación Flash sobre el navegador
     Centralizado
     Desktop


VaaS 2010
     Cloud Computing
     Aplicación Flash sobre el navegador
     Desktop y Móviles
                                                 Javier Cerviño   Alvaro Alonso
                                                        @jcague   @larsonalonso
Índice
1. Introducción a WebRTC
  1.   Descripción
  2.   Ejemplo de llamada
  3.   Estado actual

2. Problemas de WebRTC

3. Videoconferencia multiusuario
  1.   Lynckia, componentes y API
  2.   Ejemplos

                                     Javier Cerviño   Alvaro Alonso
                                            @jcague   @larsonalonso
Índice
1. Introducción a WebRTC
  1.   Descripción
  2.   Ejemplo de llamada
  3.   Estado actual

2. Problemas de WebRTC

3. Videoconferencia multiusuario
  1.   Lynckia, componentes y API
  2.   Ejemplos

                                     Javier Cerviño   Alvaro Alonso
                                            @jcague   @larsonalonso
Javier Cerviño   Alvaro Alonso
       @jcague   @larsonalonso
Videoconferencia en el
     navegador




                   Javier Cerviño   Alvaro Alonso
                          @jcague   @larsonalonso
PROTOCOLOS PROPIETARIOS
                 HTTP/WEBSOCKETS




JS/CSS/HTML                      JS/CSS/HTML

                   TRANSMISIÓN
Navegador                        Navegador
                    DE MEDIOS
                                  Javier Cerviño   Alvaro Alonso
                                         @jcague   @larsonalonso
APIs de WebRTC en JavaScript


Tres Grandes APIs
   getUserMedia
      Obtención de flujos locales


   StreamAPI
      Manejo de flujos multimedia


   PeerConnection
      Conexiones entre pares

                                    Javier Cerviño   Alvaro Alonso
                                           @jcague   @larsonalonso
Ejemplo de llamada
 1.    getUserMedia()                              5.    getUserMedia()
 2.    pc = new PeerConnection()                   6.    pc = new PeerConnection()
 3.    onLocalSignallingMessage(sdpOffer)          7.    pc.processSignalingMessage(sdpOffer)
                                                   8.    onLocalSignallingMessage(sdpAnswer)
10.   pc.processSignalingMessage(sdpAnswer)
11.   onLocalSignallingMessage(sdpOk)              13.   pc.processSignalingMessage(sdpOk
                                                         )




                                              14


           Alice                                          Javier Cerviño          Bob
                                                                            Alvaro Alonso
                                                                 @jcague    @larsonalonso
Google



Proyecto de código libre escrito en C++


Respaldado por Google, Mozilla y Opera entre otros.


Implementación de todo WebRTC


                                          Javier Cerviño   Alvaro Alonso
                                                 @jcague   @larsonalonso
Google



Primera Fase
• Librería en C++ implementando rtcweb


   Segunda Fase
   • Inclusión de la librería en navegadores
     • Implica implementación del API JavaScript


          Actualmente:
          • Primera versión disponible: iteraciones y pruebas

                                                                Javier Cerviño   Alvaro Alonso
                                                                       @jcague   @larsonalonso
Ericsson Labs




                Javier Cerviño   Alvaro Alonso
                       @jcague   @larsonalonso
Ericsson Labs

   Bowser

   Navegador Web en el móvil

   Soporte WebRTC

   Disponible para iOS y Android


   https://labs.ericsson.com/apps/bowser

                          Javier Cerviño   Alvaro Alonso
                                 @jcague   @larsonalonso
Mozilla

Firefox 18 con soporte completo de WebRTC


       GetUserMedia
       StreamAPI
       PeerConnection


Lanzamiento en enero de 2013


https://hacks.mozilla.org/2012/09/full-webrtc-support-is-soon-coming-to-a-web-browser-near-you/


                                                                                          Javier Cerviño   Alvaro Alonso
                                                                                                 @jcague   @larsonalonso
Internet Explorer

Soporte experimental de GetUserMedia

             navigator.msGetUserMedia(options, cameraStarted);


             function cameraStarted(mediaStream) {
                    msMediaStream = mediaStream;
                    document["imgPreview"].src = URL.createObjectURL(mediaStream);
             }

http://blogs.msdn.com/b/ie/archive/2012/03/16/media-capture-prototype-improved-support-for-real-world-web-apps.aspx




                                                                                    Javier Cerviño            Alvaro Alonso
                                                                                           @jcague            @larsonalonso
Opera
Soporta sólo getUserMedia


También tiene soporte en los móviles




                                       Javier Cerviño   Alvaro Alonso
                                              @jcague   @larsonalonso
Índice
1. Introducción a WebRTC
  1.   Descripción
  2.   Ejemplo de llamada
  3.   Estado actual

2. Problemas de WebRTC

3. Videoconferencia multiusuario
  1.   Lynckia, componentes y API
  2.   Ejemplos

                                     Javier Cerviño   Alvaro Alonso
                                            @jcague   @larsonalonso
Problemas de WebRTC




                Javier Cerviño   Alvaro Alonso
                       @jcague   @larsonalonso
Problemas de WebRTC




UMTSHSPA+
HSDPA
                    Javier Cerviño   Alvaro Alonso
                           @jcague   @larsonalonso
Problemas de WebRTC




                Javier Cerviño   Alvaro Alonso
                       @jcague   @larsonalonso
Problemas de WebRTC




                Javier Cerviño   Alvaro Alonso
                       @jcague   @larsonalonso
Problemas de WebRTC




        MCU
                Javier Cerviño   Alvaro Alonso
                       @jcague   @larsonalonso
Índice
1. Introducción a WebRTC
  1.   Descripción
  2.   Ejemplo de llamada
  3.   Estado actual

2. Problemas de WebRTC

3. Videoconferencia multiusuario
  1.   Lynckia, componentes y API
  2.   Ejemplos

                                     Javier Cerviño   Alvaro Alonso
                                            @jcague   @larsonalonso
Lynckia




                      Erizo


Nuve



                 Javier Cerviño   Alvaro Alonso
                        @jcague   @larsonalonso
Lynckia - Salas


        Una sala es una MCU

        Permite publicar streams
            Video, audio, datos


        Permite subscribirse a ellos

        Control desde el navegador

        Permitirá transcodificar/grabar
                    Javier Cerviño     Alvaro Alonso
                           @jcague     @larsonalonso
Lynckia - Nuve API

                Accesible a través del Backend


                Dirigido a servicios


                Administración de salas
Nuve
                    Gestiona la escalabilidad
                    Monitoriza


                Creación de tokens
                            Javier Cerviño   Alvaro Alonso
                                   @jcague   @larsonalonso
Lynckia - Erizo

          Accesible a traves del
            Frontend
  Erizo


          Contiene las MCU
             Cada sala es una de ellas


          Gestiona los streams
             Audio, video y datos

                    Javier Cerviño   Alvaro Alonso
                           @jcague   @larsonalonso
Lynckia - Erizo

          Erizo
              Disponible en:
              https://github.com/ging/erizo
  Erizo       Codigo C++
              Protocolos WebRTC
              Linux/Mac


          Erizo API
              Disponible en:
              https://github.com/ging/erizoAPI
              Wrapper en Node.js
              Pronto a traves de NPM

                          Javier Cerviño         Alvaro Alonso
                                 @jcague         @larsonalonso
Lynckia API




API Servidor                 Streams
   Rooms                     Rooms
   Tokens                    Events
   Users
API Cliente                    Javier Cerviño   Alvaro Alonso
                                      @jcague   @larsonalonso
API Servidor
Comunicación con Nuve
API para gestión del Servicio
   Salas videoconferencia
   Tokens autenticación
   Usuarios
Código
   Node.js
   Python
   (Ruby)
                                   Javier Cerviño   Alvaro Alonso
                                          @jcague   @larsonalonso
API Servidor - Room

  Propiedades                               Funciones
  Room._id                                  createRoom (name)
  Room.name                                 getRooms ()
                                            getRoom (roomId)
                                            deleteRoom (roomId)

Ejemplo
var N = require('./nuve');
N.API.init(serviceId, serviceKey);

var roomName = 'myFirstRoom';

N.API.createRoom(roomName, function(room) {
  console.log('Room created with id: ', room._id);
});

                                                           Javier Cerviño   Alvaro Alonso
                                                                  @jcague   @larsonalonso
API Servidor - Token

String con las credenciales de autenticación
     Funciones
     createToken (roomId, name, role)



   Ejemplo
   var roomId = '30121g51113e74fff3115502';
   var name = 'userName';
   var role = '';

   N.API.createToken(room, name, role, function(token) {
     console.log('Token created: ', token);
   });

                                                           Javier Cerviño   Alvaro Alonso
                                                                  @jcague   @larsonalonso
API Servidor - User

  Propiedades                               Funciones
  User.name                                 getUsers (roomId)
  User.role


Ejemplo
var roomId = '30121g51113e74fff3115502';

N.API.getUsers(roomId, function(users) {
  console.log('This room has ', users.length, 'users');

  for (var i in users) {
    console.log('User ', i, ':', users[i].name,
                  'role: ', users[i].role);
  }
});
                                                           Javier Cerviño   Alvaro Alonso
                                                                  @jcague   @larsonalonso
Lynckia API




API Servidor                 Streams
   Rooms                     Rooms
   Tokens                    Events
   Users
API Cliente                    Javier Cerviño   Alvaro Alonso
                                      @jcague   @larsonalonso
API Cliente
Comunicación con Erizo
Manejo flujos (Streams)
   Audio
   Vídeo
   Datos
Interacción salas (Rooms)
   Conexión
   Intercambio flujos
Captura eventos (Events)
   En flujos
   En salas
                                        Javier Cerviño   Alvaro Alonso
                                               @jcague   @larsonalonso
API Cliente - Stream (I)

Crear un Stream
var stream = Erizo.Stream({audio:false, video:true, data: true,
                        attributes: {name:'myStream', type: 'public'}});

Iniciar y mostrar el Stream
stream.addEventListener('access-accepted', function(event) {
  console.log("Access to webcam and microphone granted");

  stream.show('myVideoId');

});

stream.addEventListener('access-denied', function(event) {
  console.log("Access to webcam and microphone rejected");
});

stream.init();


                                                                  Javier Cerviño   Alvaro Alonso
                                                                         @jcague   @larsonalonso
API Cliente - Stream (II)

Usando el Stream
stream.addEventListener('stream-data', function(evt) {
      console.log('Received data ', evt.msg, 'from stream ', evt.stream.getID());
}

stream.sendData({text:'Hello world', timestamp:12321312});


var   frame;
var   url;
var   ctx = document.getElementById('myCanvas').getContext('2d');
var   img = document.getElementById('myImg');

setInterval (function() {
      frame = stream.getVideoFrame();
      ctx.putImageData(frame, 0, 0);

        url = stream.getVideoFrameURL();
        img.src = url;

}, 100);
                                                                    Javier Cerviño   Alvaro Alonso
                                                                           @jcague   @larsonalonso
API Cliente - Room (I)

Conectarse a una sala
var room = Erizo.Room({token:'213h8012hwduahd-321ueiwqewq'});

room.addEventListener('room-connected', function(roomEvent) {
      console.log('Connected! Streams in the room: ', roomEvent.streams);
}

room.connect();

Publicar mi stream

room.addEventListener('stream-added', function(streamEvent) {
      if (localStream.getID() === streamEvent.stream.getID()) {
            console.log('Published!');
      }
}

room.publish(localStream);


                                                                  Javier Cerviño   Alvaro Alonso
                                                                         @jcague   @larsonalonso
API Cliente - Room (II)

Suscribirse a un Stream
room.addEventListener('stream-subscribed', function(streamEvent) {
      console.log('Subscribed to stream: ', streamEvent.stream.getID());
}

room.subscribe(stream);

Y además…

room.addEventListener('stream-removed', function(streamEvent) {
      console.log('Removed stream: ', streamEvent.stream.getID());
}

room.unpublish(localStream);

room.unsubscribe(stream);

room.disconnect();

                                                                     Javier Cerviño   Alvaro Alonso
                                                                            @jcague   @larsonalonso
API Cliente - Events
   Yo                                   ERIZO                             Otros
Clientes       localStream.init()
               access-accepted

                room.connect()
           room-connected (streams)

            room.subscribe (stream)
              stream-subscribed

           room.publish (localStream)
                stream-added                        stream-added

                                                room.unpublish (stream)
               stream-removed                      stream-removed


             stream.sendData (msg)                   stream-data
                                                    Javier Cerviño         Alvaro Alonso
                                                           @jcague         @larsonalonso
ViaS
<html><head><title>Lynckia Example</title>                                                    room.addEventListener("stream-added", function (streamEvent) {
<script type="text/javascript" src="http://…/erizo.js"></script>                                    var streams = [];
<script type="text/javascript”>                                                                     streams.push(streamEvent.stream);
    window.onload = function () {                                                                   subscribeToStreams(streams);
                                                                                               });
        var localStream = Erizo.Stream({audio: true, video: true, data: true});                room.addEventListener("stream-removed", function (streamEvent) {
        var room = Erizo.Room({token: '213h8012hwduahd-321ueiwqewq'});                              var stream = streamEvent.stream;
                                                                                                    if (stream.elementID !== undefined) {
         localStream.addEventListener("access-accepted", function () {
                                                                                                        var element = document.getElementById(stream.elementID);
         var subscribeToStreams = function (streams) {                                                  document.body.removeChild(element);
              for (var index in streams) {                                                          }
                  var stream = streams[index];                                                 });
                  if (localStream.getID() !== stream.getID())
                       room.subscribe(stream);
              }                                                                                    room.connect();
           };                                                                                      localStream.show("myVideo");
          room.addEventListener("room-connected", function (roomEvent) {                           });
               room.publish(localStream);
               subscribeToStreams(roomEvent.streams);
                                                                                                   localStream.init();
          });
                                                                                       };
         room.addEventListener("stream-subscribed", function(streamEvent) {           </head>
                       var stream = streamEvent.stream;                                </script>
                                                                                          <body>
                       var div = document.createElement('div');
                       div.setAttribute("style", "width: 320px; height: 240px;");                   <div id="myVideo" style="width:320px; height: 240px;”></div>
                       div.setAttribute("id", "test" + stream.getID());                 </body>
                       document.body.appendChild(div);                                </html>

                     stream.show("test" + stream.getID());
          });                                                                                                            Javier Cerviño                   Alvaro Alonso
                                                                                                                                @jcague                   @larsonalonso
Demos
Demo: Guess Who!




http://www.youtube.com/watch?v=e3tn-uh5Wbo
                            Javier Cerviño   Alvaro Alonso
                                   @jcague   @larsonalonso
Demo: Guess Who!

 myConfigStream = Erizo.Stream({audio: false, video: false, data: true,
                                         attributes: {name: 'configStream'}});
 room.publish(myConfigStream);

 for (var cs in configStreams) {
       room.subscribe(configStreams[cs]);
       configStreams[cs].addEventListener("stream-data", function(evt) {

            var msg = evt.msg; var stream = evt.stream;
            if (msg.state === 'free') {
                myConfigStream.sendData({state: 'selected', yourID: stream.getID()});

            } else if (msg.state === 'selected' && msg.yourID === myConfigStream.getID()) {
                myConfigStream.sendData({state: 'ok', yourID: stream.getID()});
                startPlaying(stream);

        }     else if (msg.state === 'ok’ && msg.yourID === myConfigStream.getID()) {
                startPlaying(stream);
        }
       });
 }
 myConfigStream.sendData({state: 'free'});
                                                                                 Javier Cerviño   Alvaro Alonso
Basado en threede.js                                                                    @jcague   @larsonalonso
Javier Cerviño   Alvaro Alonso
       @jcague   @larsonalonso
MashMeTV




http://www.youtube.com/watch?v=3XZ-ffdPFH0
                             Javier Cerviño   Alvaro Alonso
                                    @jcague   @larsonalonso
Demo: MashMe TV




var canvas = document.createElement('canvas');
canvas.id = "testing";
canvas.width = "100px";
canvas.height = "50px";
document.body.appendChild(canvas);

var context = canvas.getContext('2d');
document.getElementById("myVideo").onclick = function() {

      var frame = stream.getVideoFrame();
      context.putImageData(frame, 0, 0);
}                                                           Javier Cerviño   Alvaro Alonso
                                                                   @jcague   @larsonalonso
Demo CSS 3D




http://www.youtube.com/watch?v=7wLTUaGJfQ0
                            Javier Cerviño   Alvaro Alonso
                                   @jcague   @larsonalonso
room.addEventListener("stream-subscribed", function(streamEvent) {

      var winDiv = document.createElement('div');
      winDiv.setAttribute("style", "width: 345x; height: 3D Game
                                                   Demo: 305px;");
      winDiv.setAttribute("id", "window");

      world.addPlane( new PlaneVideo(winDiv, 345, 305, 30, 588, -400,90,0,0));
      streamEvent.stream.show('window');
}

function PlaneVideo(videodiv, w,h,x,y,z,rx,ry,rz, options) {

    this.node = document.createElement("div");
    this.node.appendChild(videodiv);
     …
    this.node.style.cssText +=
                "-webkit-transform:" +
                "translate3d(" + x + "px," + y + "px," + z + "px)" +
                "rotateX(" + rx + "deg)" +
                "rotateY(" + ry + "deg)" +
                "rotateZ(" + rz + "deg);" +
                "-webkit-filter: blur(2px);";
}
Muchas gracias!!
Preguntas???




  Javier Cerviño        Alvaro Alonso
  jcervino@dit.upm.es   aalonsog@dit.upm.es
  @jcague               @larsonalonso

Más contenido relacionado

PPTX
PDF
Webrtc sur.gdgdevfest.com - @dperilla
PDF
Webinar WebRTC y HTML5 (spanish) - Quobis
PPT
El Web 2.0 MóVil Caminando Hacia El Teleco 2.0 Sin Caratula
PPTX
WebRTC y Kurento en el T3cgFest 2015
ODP
Si sólo ves un webphone no entiendes WebRTC
PDF
Experiencia de uso de WebRTC en la educación
PDF
WebRTC en tu web con OpenVidu
Webrtc sur.gdgdevfest.com - @dperilla
Webinar WebRTC y HTML5 (spanish) - Quobis
El Web 2.0 MóVil Caminando Hacia El Teleco 2.0 Sin Caratula
WebRTC y Kurento en el T3cgFest 2015
Si sólo ves un webphone no entiendes WebRTC
Experiencia de uso de WebRTC en la educación
WebRTC en tu web con OpenVidu

La actualidad más candente (10)

PDF
JsSIP: SIP + WebRTC
PDF
Software libre para videoconferencias
PPTX
Implementación de microservicios en Vocento
PDF
Google Web Toolkit (GWT) en entornos empresariales
PDF
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
PPTX
Jessica Guisado, 2022, Desarrollo de una aplicación Blockchain con la tecnolo...
PPT
SIPML5toElastix
PPTX
Introducción a microservicios
PDF
Dev Tools para Kubernetes - Codemotion 2019
PDF
Divide y Vencerás: introducción a los Microservicios
JsSIP: SIP + WebRTC
Software libre para videoconferencias
Implementación de microservicios en Vocento
Google Web Toolkit (GWT) en entornos empresariales
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Jessica Guisado, 2022, Desarrollo de una aplicación Blockchain con la tecnolo...
SIPML5toElastix
Introducción a microservicios
Dev Tools para Kubernetes - Codemotion 2019
Divide y Vencerás: introducción a los Microservicios
Publicidad

Destacado (20)

PDF
HTML5 Today #4
PDF
Re-using Media on the Web tutorial: Media Fragment Creation and Annotation
PDF
Remixing Media on the Web: Media Fragment Specification and Semantics
PPT
Re-using Media on the Web: Media fragment re-mixing and playout
PPT
Tutorial Frutos del Futuro
DOCX
La virgen
PPT
Diagnóstico de salud
DOC
calentamiento global
PPT
Conductas Antiambientales
PPT
Architectural Association
PPTX
C:\Fakepath\Grupo Co Neu
PPT
HISTORIA DE INTERNET
 
PDF
Redes neuronales
DOCX
Caño juan
PDF
Estudio Inversion IAB España 2010
DOCX
Clase 3. Apuntes.
PPT
MATES
PPTX
Caminos sobre la mar
PPS
Pedraza En La Noche De Las Velas
HTML5 Today #4
Re-using Media on the Web tutorial: Media Fragment Creation and Annotation
Remixing Media on the Web: Media Fragment Specification and Semantics
Re-using Media on the Web: Media fragment re-mixing and playout
Tutorial Frutos del Futuro
La virgen
Diagnóstico de salud
calentamiento global
Conductas Antiambientales
Architectural Association
C:\Fakepath\Grupo Co Neu
HISTORIA DE INTERNET
 
Redes neuronales
Caño juan
Estudio Inversion IAB España 2010
Clase 3. Apuntes.
MATES
Caminos sobre la mar
Pedraza En La Noche De Las Velas
Publicidad

Similar a Presentación WebRTC y Lynckia (20)

PDF
WebRTC - Una nueva tecnología web al servicio de la educación. Caso en Virtua...
PDF
OpenVidu Commitconf 2018
PDF
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
PDF
Iñaki Baz - VoIP2DAY 2017 | WebRTC: Más allá de conferencias
ODP
[VoIP2Day 2013] Si sólo ves un webphone no entiendes WebRTC
PDF
Más allá de conferencias | IÑAKI BAZ - VoIP2DAY 2017
PPT
WebRTC Synopsis
PDF
V2 d2013 jose l millan e iñaki baz - webrtc
ODP
[ElastixWorld 2013 Mexico] Si sólo ves un webphone no entiendes WebRTC
ODP
[4K Conf 2012] SIP y WebRTC para Seres Humanos (tm)
PPT
WebRCT "VoIP también desde el navegador"
PPT
Webrtc"VoIP también desde el navegador"
PPTX
Introducción a las aplicaciones web
PDF
Paper ieee
PPTX
S6-DAW-2022S1.pptx
PDF
Html5 telefonica-curso
PPTX
Pincipios css3 & html5
PDF
Desarrollo multiplataforma de apps con GWT y PhoneGap
PDF
Charla 1er betabeers Córdoba
PDF
Estrategias Web para notifiaciones
WebRTC - Una nueva tecnología web al servicio de la educación. Caso en Virtua...
OpenVidu Commitconf 2018
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Iñaki Baz - VoIP2DAY 2017 | WebRTC: Más allá de conferencias
[VoIP2Day 2013] Si sólo ves un webphone no entiendes WebRTC
Más allá de conferencias | IÑAKI BAZ - VoIP2DAY 2017
WebRTC Synopsis
V2 d2013 jose l millan e iñaki baz - webrtc
[ElastixWorld 2013 Mexico] Si sólo ves un webphone no entiendes WebRTC
[4K Conf 2012] SIP y WebRTC para Seres Humanos (tm)
WebRCT "VoIP también desde el navegador"
Webrtc"VoIP también desde el navegador"
Introducción a las aplicaciones web
Paper ieee
S6-DAW-2022S1.pptx
Html5 telefonica-curso
Pincipios css3 & html5
Desarrollo multiplataforma de apps con GWT y PhoneGap
Charla 1er betabeers Córdoba
Estrategias Web para notifiaciones

Último (20)

PPTX
Presentación de Redes de Datos modelo osi
PDF
Diapositiva proyecto de vida, materia catedra
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PPTX
Presentación PASANTIAS AuditorioOO..pptx
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
clase auditoria informatica 2025.........
PDF
Estrategia de apoyo tecnología miguel angel solis
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
Presentación de Redes de Datos modelo osi
Diapositiva proyecto de vida, materia catedra
Propuesta BKP servidores con Acronis1.pptx
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Presentación PASANTIAS AuditorioOO..pptx
Zarate Quispe Alex aldayir aplicaciones de internet .docx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
SAP Transportation Management para LSP, TM140 Col18
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Plantilla para Diseño de Narrativas Transmedia.pdf
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Power Point Nicolás Carrasco (disertación Roblox).pptx
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Calidad desde el Docente y la mejora continua .pdf
clase auditoria informatica 2025.........
Estrategia de apoyo tecnología miguel angel solis
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx

Presentación WebRTC y Lynckia

  • 1. WebRTC Comunicaciones en tiempo real desde tu navegador Javier Cerviño Alvaro Alonso Pedro Rodriguez jcervino@dit.upm.es aalonsog@dit.upm.es prodriguez@dit.upm.es @jcague @larsonalonso @lodoyun Nestor Toribio Joaquín Salvachúa nestortoribioruiz@gmail.com jsr@dit.upm.es @nehko1 @jsalvachua Grupo de Internet de Nueva Generación Departamento de Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid
  • 2. Previously on GING Isabel 1995 (o por ahi) Aplicación de escritorio Ubuntu/Windows P2P/Centralizado Pasarelas SIP Marte 2007 Aplicación Flash sobre el navegador Centralizado Desktop VaaS 2010 Cloud Computing Aplicación Flash sobre el navegador Desktop y Móviles Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 3. Índice 1. Introducción a WebRTC 1. Descripción 2. Ejemplo de llamada 3. Estado actual 2. Problemas de WebRTC 3. Videoconferencia multiusuario 1. Lynckia, componentes y API 2. Ejemplos Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 4. Índice 1. Introducción a WebRTC 1. Descripción 2. Ejemplo de llamada 3. Estado actual 2. Problemas de WebRTC 3. Videoconferencia multiusuario 1. Lynckia, componentes y API 2. Ejemplos Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 5. Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 6. Videoconferencia en el navegador Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 7. PROTOCOLOS PROPIETARIOS HTTP/WEBSOCKETS JS/CSS/HTML JS/CSS/HTML TRANSMISIÓN Navegador Navegador DE MEDIOS Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 8. APIs de WebRTC en JavaScript Tres Grandes APIs getUserMedia Obtención de flujos locales StreamAPI Manejo de flujos multimedia PeerConnection Conexiones entre pares Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 9. Ejemplo de llamada 1. getUserMedia() 5. getUserMedia() 2. pc = new PeerConnection() 6. pc = new PeerConnection() 3. onLocalSignallingMessage(sdpOffer) 7. pc.processSignalingMessage(sdpOffer) 8. onLocalSignallingMessage(sdpAnswer) 10. pc.processSignalingMessage(sdpAnswer) 11. onLocalSignallingMessage(sdpOk) 13. pc.processSignalingMessage(sdpOk ) 14 Alice Javier Cerviño Bob Alvaro Alonso @jcague @larsonalonso
  • 10. Google Proyecto de código libre escrito en C++ Respaldado por Google, Mozilla y Opera entre otros. Implementación de todo WebRTC Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 11. Google Primera Fase • Librería en C++ implementando rtcweb Segunda Fase • Inclusión de la librería en navegadores • Implica implementación del API JavaScript Actualmente: • Primera versión disponible: iteraciones y pruebas Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 12. Ericsson Labs Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 13. Ericsson Labs Bowser Navegador Web en el móvil Soporte WebRTC Disponible para iOS y Android https://labs.ericsson.com/apps/bowser Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 14. Mozilla Firefox 18 con soporte completo de WebRTC GetUserMedia StreamAPI PeerConnection Lanzamiento en enero de 2013 https://hacks.mozilla.org/2012/09/full-webrtc-support-is-soon-coming-to-a-web-browser-near-you/ Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 15. Internet Explorer Soporte experimental de GetUserMedia navigator.msGetUserMedia(options, cameraStarted); function cameraStarted(mediaStream) { msMediaStream = mediaStream; document["imgPreview"].src = URL.createObjectURL(mediaStream); } http://blogs.msdn.com/b/ie/archive/2012/03/16/media-capture-prototype-improved-support-for-real-world-web-apps.aspx Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 16. Opera Soporta sólo getUserMedia También tiene soporte en los móviles Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 17. Índice 1. Introducción a WebRTC 1. Descripción 2. Ejemplo de llamada 3. Estado actual 2. Problemas de WebRTC 3. Videoconferencia multiusuario 1. Lynckia, componentes y API 2. Ejemplos Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 18. Problemas de WebRTC Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 19. Problemas de WebRTC UMTSHSPA+ HSDPA Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 20. Problemas de WebRTC Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 21. Problemas de WebRTC Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 22. Problemas de WebRTC MCU Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 23. Índice 1. Introducción a WebRTC 1. Descripción 2. Ejemplo de llamada 3. Estado actual 2. Problemas de WebRTC 3. Videoconferencia multiusuario 1. Lynckia, componentes y API 2. Ejemplos Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 24. Lynckia Erizo Nuve Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 25. Lynckia - Salas Una sala es una MCU Permite publicar streams Video, audio, datos Permite subscribirse a ellos Control desde el navegador Permitirá transcodificar/grabar Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 26. Lynckia - Nuve API Accesible a través del Backend Dirigido a servicios Administración de salas Nuve Gestiona la escalabilidad Monitoriza Creación de tokens Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 27. Lynckia - Erizo Accesible a traves del Frontend Erizo Contiene las MCU Cada sala es una de ellas Gestiona los streams Audio, video y datos Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 28. Lynckia - Erizo Erizo Disponible en: https://github.com/ging/erizo Erizo Codigo C++ Protocolos WebRTC Linux/Mac Erizo API Disponible en: https://github.com/ging/erizoAPI Wrapper en Node.js Pronto a traves de NPM Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 29. Lynckia API API Servidor Streams Rooms Rooms Tokens Events Users API Cliente Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 30. API Servidor Comunicación con Nuve API para gestión del Servicio Salas videoconferencia Tokens autenticación Usuarios Código Node.js Python (Ruby) Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 31. API Servidor - Room Propiedades Funciones Room._id createRoom (name) Room.name getRooms () getRoom (roomId) deleteRoom (roomId) Ejemplo var N = require('./nuve'); N.API.init(serviceId, serviceKey); var roomName = 'myFirstRoom'; N.API.createRoom(roomName, function(room) { console.log('Room created with id: ', room._id); }); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 32. API Servidor - Token String con las credenciales de autenticación Funciones createToken (roomId, name, role) Ejemplo var roomId = '30121g51113e74fff3115502'; var name = 'userName'; var role = ''; N.API.createToken(room, name, role, function(token) { console.log('Token created: ', token); }); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 33. API Servidor - User Propiedades Funciones User.name getUsers (roomId) User.role Ejemplo var roomId = '30121g51113e74fff3115502'; N.API.getUsers(roomId, function(users) { console.log('This room has ', users.length, 'users'); for (var i in users) { console.log('User ', i, ':', users[i].name, 'role: ', users[i].role); } }); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 34. Lynckia API API Servidor Streams Rooms Rooms Tokens Events Users API Cliente Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 35. API Cliente Comunicación con Erizo Manejo flujos (Streams) Audio Vídeo Datos Interacción salas (Rooms) Conexión Intercambio flujos Captura eventos (Events) En flujos En salas Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 36. API Cliente - Stream (I) Crear un Stream var stream = Erizo.Stream({audio:false, video:true, data: true, attributes: {name:'myStream', type: 'public'}}); Iniciar y mostrar el Stream stream.addEventListener('access-accepted', function(event) { console.log("Access to webcam and microphone granted"); stream.show('myVideoId'); }); stream.addEventListener('access-denied', function(event) { console.log("Access to webcam and microphone rejected"); }); stream.init(); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 37. API Cliente - Stream (II) Usando el Stream stream.addEventListener('stream-data', function(evt) { console.log('Received data ', evt.msg, 'from stream ', evt.stream.getID()); } stream.sendData({text:'Hello world', timestamp:12321312}); var frame; var url; var ctx = document.getElementById('myCanvas').getContext('2d'); var img = document.getElementById('myImg'); setInterval (function() { frame = stream.getVideoFrame(); ctx.putImageData(frame, 0, 0); url = stream.getVideoFrameURL(); img.src = url; }, 100); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 38. API Cliente - Room (I) Conectarse a una sala var room = Erizo.Room({token:'213h8012hwduahd-321ueiwqewq'}); room.addEventListener('room-connected', function(roomEvent) { console.log('Connected! Streams in the room: ', roomEvent.streams); } room.connect(); Publicar mi stream room.addEventListener('stream-added', function(streamEvent) { if (localStream.getID() === streamEvent.stream.getID()) { console.log('Published!'); } } room.publish(localStream); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 39. API Cliente - Room (II) Suscribirse a un Stream room.addEventListener('stream-subscribed', function(streamEvent) { console.log('Subscribed to stream: ', streamEvent.stream.getID()); } room.subscribe(stream); Y además… room.addEventListener('stream-removed', function(streamEvent) { console.log('Removed stream: ', streamEvent.stream.getID()); } room.unpublish(localStream); room.unsubscribe(stream); room.disconnect(); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 40. API Cliente - Events Yo ERIZO Otros Clientes localStream.init() access-accepted room.connect() room-connected (streams) room.subscribe (stream) stream-subscribed room.publish (localStream) stream-added stream-added room.unpublish (stream) stream-removed stream-removed stream.sendData (msg) stream-data Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 41. ViaS <html><head><title>Lynckia Example</title> room.addEventListener("stream-added", function (streamEvent) { <script type="text/javascript" src="http://…/erizo.js"></script> var streams = []; <script type="text/javascript”> streams.push(streamEvent.stream); window.onload = function () { subscribeToStreams(streams); }); var localStream = Erizo.Stream({audio: true, video: true, data: true}); room.addEventListener("stream-removed", function (streamEvent) { var room = Erizo.Room({token: '213h8012hwduahd-321ueiwqewq'}); var stream = streamEvent.stream; if (stream.elementID !== undefined) { localStream.addEventListener("access-accepted", function () { var element = document.getElementById(stream.elementID); var subscribeToStreams = function (streams) { document.body.removeChild(element); for (var index in streams) { } var stream = streams[index]; }); if (localStream.getID() !== stream.getID()) room.subscribe(stream); } room.connect(); }; localStream.show("myVideo"); room.addEventListener("room-connected", function (roomEvent) { }); room.publish(localStream); subscribeToStreams(roomEvent.streams); localStream.init(); }); }; room.addEventListener("stream-subscribed", function(streamEvent) { </head> var stream = streamEvent.stream; </script> <body> var div = document.createElement('div'); div.setAttribute("style", "width: 320px; height: 240px;"); <div id="myVideo" style="width:320px; height: 240px;”></div> div.setAttribute("id", "test" + stream.getID()); </body> document.body.appendChild(div); </html> stream.show("test" + stream.getID()); }); Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 42. Demos
  • 43. Demo: Guess Who! http://www.youtube.com/watch?v=e3tn-uh5Wbo Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 44. Demo: Guess Who! myConfigStream = Erizo.Stream({audio: false, video: false, data: true, attributes: {name: 'configStream'}}); room.publish(myConfigStream); for (var cs in configStreams) { room.subscribe(configStreams[cs]); configStreams[cs].addEventListener("stream-data", function(evt) { var msg = evt.msg; var stream = evt.stream; if (msg.state === 'free') { myConfigStream.sendData({state: 'selected', yourID: stream.getID()}); } else if (msg.state === 'selected' && msg.yourID === myConfigStream.getID()) { myConfigStream.sendData({state: 'ok', yourID: stream.getID()}); startPlaying(stream); } else if (msg.state === 'ok’ && msg.yourID === myConfigStream.getID()) { startPlaying(stream); } }); } myConfigStream.sendData({state: 'free'}); Javier Cerviño Alvaro Alonso Basado en threede.js @jcague @larsonalonso
  • 45. Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 46. MashMeTV http://www.youtube.com/watch?v=3XZ-ffdPFH0 Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 47. Demo: MashMe TV var canvas = document.createElement('canvas'); canvas.id = "testing"; canvas.width = "100px"; canvas.height = "50px"; document.body.appendChild(canvas); var context = canvas.getContext('2d'); document.getElementById("myVideo").onclick = function() { var frame = stream.getVideoFrame(); context.putImageData(frame, 0, 0); } Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 48. Demo CSS 3D http://www.youtube.com/watch?v=7wLTUaGJfQ0 Javier Cerviño Alvaro Alonso @jcague @larsonalonso
  • 49. room.addEventListener("stream-subscribed", function(streamEvent) { var winDiv = document.createElement('div'); winDiv.setAttribute("style", "width: 345x; height: 3D Game Demo: 305px;"); winDiv.setAttribute("id", "window"); world.addPlane( new PlaneVideo(winDiv, 345, 305, 30, 588, -400,90,0,0)); streamEvent.stream.show('window'); } function PlaneVideo(videodiv, w,h,x,y,z,rx,ry,rz, options) { this.node = document.createElement("div"); this.node.appendChild(videodiv); … this.node.style.cssText += "-webkit-transform:" + "translate3d(" + x + "px," + y + "px," + z + "px)" + "rotateX(" + rx + "deg)" + "rotateY(" + ry + "deg)" + "rotateZ(" + rz + "deg);" + "-webkit-filter: blur(2px);"; }
  • 50. Muchas gracias!! Preguntas??? Javier Cerviño Alvaro Alonso jcervino@dit.upm.es aalonsog@dit.upm.es @jcague @larsonalonso