SDK de Node para la Video API de Vonage

El SDK de OpenTok Node ofrece métodos para:

Instalación mediante npm (recomendado):

npm ayuda a gestionar las dependencias de los proyectos de Node. Para más información, consulta aquí: http://npmjs.org.

Ejecute este comando para instalar el paquete y añadirlo a su package.json:

$ npm install opentok --save

Uso

Inicialización de

Importa el módulo para obtener una función constructora de un objeto OpenTok y, a continuación, llámala con new para instanciar un objeto OpenTok con tu propia clave API y tu propio secreto API.

const OpenTok = require("opentok");
const opentok = new OpenTok(apiKey, apiSecret);

Aumentar los tiempos de espera

Actualmente, la biblioteca tiene un tiempo de espera de 20 segundos para las solicitudes. Si te conectas a una red lenta y necesitas aumentar el tiempo de espera, puedes indicarlo (en milisegundos) al instanciar el objeto OpenTok.

const OpenTok = require("opentok");
const opentok = new OpenTok(apiKey, apiSecret, { timeout: 30000});

Creación de sesiones

Para crear una sesión de OpenTok, utiliza el OpenTok.createSession(properties, callback) método. En properties El parámetro es un objeto opcional que se utiliza para especificar si la sesión utiliza el OpenTok Media Router, para indicar una sugerencia de ubicación y para especificar si la sesión se archivará automáticamente o no. La función de devolución de llamada tiene la firma function(error, session). En session Lo que se devuelve en la función de llamada de retorno es una instancia de Session. Los objetos Session tienen un sessionId propiedad que es útil para ser guardada en un almacén persistente (como una base de datos).

// Create a session that will attempt to transmit streams directly between
// clients. If clients cannot connect, the session uses the OpenTok TURN server:
opentok.createSession(function (err, session) {
  if (err) return console.log(err);

  // save the sessionId
  db.save("session", session.sessionId, done);
});

// The session will the OpenTok Media Router:
opentok.createSession({ mediaMode: "routed" }, function (err, session) {
  if (err) return console.log(err);

  // save the sessionId
  db.save("session", session.sessionId, done);
});

// A Session with a location hint
opentok.createSession({ location: "12.34.56.78" }, function (err, session) {
  if (err) return console.log(err);

  // save the sessionId
  db.save("session", session.sessionId, done);
});

// A Session with an automatic archiving
opentok.createSession({ mediaMode: "routed", archiveMode: "always" }, function (
  err,
  session
) {
  if (err) return console.log(err);

  // save the sessionId
  db.save("session", session.sessionId, done);
});

Generación de fichas

Una vez creada una Sesión, puede empezar a generar Tokens para que los clientes los utilicen cuando se conecten a ella. Puede generar un token llamando a la función OpenTok.generateToken(sessionId, options) método. Otra forma es llamar a la generateToken(options) método de un objeto Session. El options El parámetro es un objeto opcional que se utiliza para configurar el rol, el tiempo de caducidad y los datos de conexión del token. Para el control del diseño en archivos y retransmisiones, también se puede configurar la lista inicial de clases de diseño de las transmisiones publicadas desde conexiones que utilicen este token.

// Generate a Token from just a sessionId (fetched from a database)
token = opentok.generateToken(sessionId);

// Generate a Token from a session object (returned from createSession)
token = session.generateToken();

// Set some options in a Token
token = session.generateToken({
  role: "moderator",
  expireTime: new Date().getTime() / 1000 + 7 * 24 * 60 * 60, // in one week
  data: "name=Johnny",
  initialLayoutClassList: ["focus"],
});

Trabajar con archivos

Puedes iniciar la grabación de una sesión de OpenTok utilizando el OpenTok.startArchive(sessionId, options, callback) método. En options El parámetro es un objeto opcional que se utiliza para establecer el nombre del archivo. La función de devolución de llamada tiene la firma function(err, archive). En archive Lo que se devuelve en la función de llamada es una instancia de Archive. Ten en cuenta que solo puedes iniciar un archivo en una sesión con clientes conectados.

opentok.startArchive(sessionId, { name: "Important Presentation" }, function (
  err,
  archive
) {
  if (err) {
    return console.log(err);
  } else {
    // The id property is useful to save off into a database
    console.log("new archive:" + archive.id);
  }
});

También puedes desactivar la grabación de audio o vídeo configurando la opción hasAudio o hasVideo propiedad de la página options parámetro a false:

var archiveOptions = {
  name: "Important Presentation",
  hasVideo: false, // Record audio only
};
opentok.startArchive(sessionId, archiveOptions, function (err, archive) {
  if (err) {
    return console.log(err);
  } else {
    // The id property is useful to save to a database
    console.log("new archive:" + archive.id);
  }
});

De forma predeterminada, todas las secuencias se graban en un único archivo (compuesto). Puedes grabar las diferentes secuencias de la sesión en archivos individuales (en lugar de en un único archivo compuesto) configurando el outputMode opción de 'individual' cuando llamas al OpenTok.startArchive() método:

var archiveOptions = {
  name: "Important Presentation",
  outputMode: "individual",
};
opentok.startArchive(sessionId, archiveOptions, function (err, archive) {
  if (err) {
    return console.log(err);
  } else {
    // The id property is useful to save off into a database
    console.log("new archive:" + archive.id);
  }
});

Puede detener la grabación de un Archivo iniciado utilizando la tecla OpenTok.stopArchive(archiveId, callback) método. También puedes hacerlo utilizando el Archive.stop(callback) método a Archive instancia. La función de devolución de llamada tiene una firma function(err, archive). En archive Lo que se devuelve en la función de llamada de retorno es una instancia de Archive.

opentok.stopArchive(archiveId, function (err, archive) {
  if (err) return console.log(err);

  console.log("Stopped archive:" + archive.id);
});

archive.stop(function (err, archive) {
  if (err) return console.log(err);
});

Para obtener un Archive (y toda la información sobre ella) de una instancia de archiveId, utiliza el OpenTok.getArchive(archiveId, callback) método. La llamada de retorno tiene una firma de función function(err, archive). Para obtener más detalles, puedes consultar las propiedades del archivo.

opentok.getArchive(archiveId, function (err, archive) {
  if (err) return console.log(err);

  console.log(archive);
});

Para eliminar un archivo, puedes llamar a la función OpenTok.deleteArchive(archiveId, callback) método o el delete(callback) método de un Archive instancia. La función de devolución de llamada tiene una firma function(err).

// Delete an Archive from an archiveId (fetched from database)
opentok.deleteArchive(archiveId, function (err) {
  if (err) console.log(err);
});

// Delete an Archive from an Archive instance, returned from the OpenTok.startArchive(),
// OpenTok.getArchive(), or OpenTok.listArchives() methods
archive.delete(function (err) {
  if (err) console.log(err);
});

También puede obtener una lista de todos los Archivos que ha creado (hasta 1000) con su Clave API. Para ello utilizando la función OpenTok.listArchives(options, callback) método. El parámetro options es un objeto opcional que se utiliza para especificar un offset y count para ayudarte a paginar los resultados. La función de llamada tiene la siguiente sintaxis: function(err, archives, totalCount). En archives Lo que devuelve la función de llamada es una matriz de Archive casos. El totalCount El valor devuelto por la función de devolución de llamada es el número total de archivos que ha generado tu clave API.

opentok.listArchives({ offset: 100, count: 50 }, function (
  error,
  archives,
  totalCount
) {
  if (error) return console.log("error:", error);

  console.log(totalCount + " archives");
  for (var i = 0; i < archives.length; i++) {
    console.log(archives[i].id);
  }
});

Tenga en cuenta que también puede crear una sesión archivada automáticamente, pasando en 'always' como el archiveMode opción al llamar a la OpenTok.createSession() método (véase «Creación de sesiones», más arriba).

En el caso de los archivos compuestos, puede cambiar el diseño dinámicamente mediante la función OpenTok.setArchiveLayout(archiveId, type, stylesheet, screenshareType, callback) método:

opentok.setArchiveLayout(archiveId, type, null, null, function (err) {
  if (err) return console.log("error:", error);
});

Puedes establecer la clase de diseño inicial para las transmisiones de un cliente configurando el layout cuando al crear el token para el cliente, utilizando la opción OpenTok.generateToken() método. Y puede cambiar las clases de diseño de los flujos en una sesión llamando al método OpenTok.setStreamClassLists(sessionId, classListArray, callback) método.

La configuración del diseño de los archivos compuestos es opcional. Por defecto, los archivos compuestos utilizan la disposición disposición "más adecuada" (véase Personalización del diseño de vídeo para composiciones archivos).

Para obtener más información sobre el archivado, consulta el Guía para desarrolladores sobre el archivado de OpenTok.

Trabajar con retransmisiones en directo

Importante: Solo sesiones de OpenTok enrutadas admiten retransmisiones en directo.

Para iniciar un retransmisión en directo emisión de una sesión de OpenTok, llama a la OpenTok.startBroadcast() método. Se le pasan tres parámetros: el ID de sesión correspondiente a la sesión, las opciones de la retransmisión y una función de devolución de llamada:

var broadcastOptions = {
  outputs: {
    hls: {},
    rtmp: [
      {
        id: "foo",
        serverUrl: "rtmp://myfooserver/myfooapp",
        streamName: "myfoostream",
      },
      {
        id: "bar",
        serverUrl: "rtmp://mybarserver/mybarapp",
        streamName: "mybarstream",
      },
    ],
  },
  maxDuration: 5400,
  resolution: "640x480",
  layout: {
    type: "verticalPresentation",
  },
};
opentok.startBroadcast(sessionId, broadcastOptions, function (
  error,
  broadcast
) {
  if (error) {
    return console.log(error);
  }
  return console.log("Broadcast started: ", broadcast.id);
});

Consulta la referencia de la API para obtener más información sobre el options parámetro.

Si la operación se realiza correctamente, se pasa un objeto `Broadcast` a la función de llamada de retorno como segundo parámetro. El objeto `Broadcast` tiene propiedades que definen la difusión, entre ellas un broadcastUrls que contiene las direcciones URL de los flujos de difusión. Consulte la referencia de la API para más detalles.

Llame al OpenTok.stopBroadcast() para detener una emisión en directo, introduzca el ID de emisión (el id del objeto Broadcast) como primer parámetro. El segundo es la función de devolución de llamada:

opentok.stopBroadcast(broadcastId, function (error, broadcast) {
  if (error) {
    return console.log(error);
  }
  return console.log("Broadcast stopped: ", broadcast.id);
});

También puede llamar al stop() método del objeto Broadcast para detener una emisión.

Llame al Opentok.getBroadcast() método, pasando un identificador de emisión, para obtener un objeto Broadcast.

También puede obtener una lista de todas las difusiones que ha creado (hasta 1000) con su clave API. Para ello se realiza mediante la función OpenTok.listBroadcasts(options, callback) método. El parámetro options es un objeto opcional que se utiliza para especificar un offset, county sessionId para ayudarte a paginar los resultados. La función de llamada tiene la siguiente sintaxis: function(err, broadcasts, totalCount). En broadcasts Lo que devuelve la función de llamada es una matriz de Broadcast casos. El totalCount El valor devuelto por la función de devolución de llamada es el número total de difusiones que ha generado tu clave API.

opentok.listBroadcasts({ offset: 100, count: 50 }, function (
  error,
  broadcasts,
  totalCount
) {
  if (error) return console.log("error:", error);

  console.log(totalCount + " broadcasts");
  for (var i = 0; i < broadcasts.length; i++) {
    console.log(broadcasts[i].id);
  }
});

Para cambiar la disposición de la emisión, llame a la función OpenTok.setBroadcastLayout() método, pasándole el ID de difusión y el diseño tipo.

Puedes establecer la clase de diseño inicial para las transmisiones de un cliente configurando el layout cuando al crear el token para el cliente, utilizando la opción OpenTok.generateToken() método. Y puede cambiar las clases de diseño de los flujos en una sesión llamando al método OpenTok.setStreamClassLists(sessionId, classListArray, callback) método.

Configurar el diseño de una retransmisión en directo es opcional. De forma predeterminada, las retransmisiones en directo utilizan el diseño «que mejor se adapta».

Envío de señales

Puedes enviar una señal a todos los participantes de una sesión de OpenTok llamando a la función OpenTok.signal(sessionId, connectionId, payload, callback) método y configuración el connectionId parámetro a null:

var sessionId =
  "2_MX2xMDB-flR1ZSBOb3YgMTkgMTE6MDk6NTggUFNUIDIwMTN-MC2zNzQxNzIxNX2";
opentok.signal(sessionId, null, { type: "chat", data: "Hello!" }, function (
  error
) {
  if (error) return console.log("error:", error);
});

O bien, envía una señal a un participante concreto de la sesión llamando al OpenTok.signal(sessionId, connectionId, payload, callback) y configurando todos los parámetros, incluyendo connectionId:

var sessionId =
  "2_MX2xMDB-flR1ZSBOb3YgMTkgMTE6MDk6NTggUFNUIDIwMTN-MC2zNzQxNzIxNX2";
var connectionId = "02e80876-02ab-47cd-8084-6ddc8887afbc";
opentok.signal(
  sessionId,
  connectionId,
  { type: "chat", data: "Hello!" },
  function (error) {
    if (error) return console.log("error:", error);
  }
);

Este es el equivalente del lado del servidor al método signal() de los SDK de cliente de OpenTok. Véase Guía para desarrolladores de señalización de OpenTok.

Desconexión de participantes

Puedes desconectar a los participantes de una sesión de OpenTok utilizando el OpenTok.forceDisconnect(sessionId, connectionId, callback) método.

opentok.forceDisconnect(sessionId, connectionId, function (error) {
  if (error) return console.log("error:", error);
});

Este es el equivalente del lado del servidor al método forceDisconnect() de OpenTok.js: Guía de moderación de OpenTok.js.

Forzar a los clientes de una sesión a silenciar el audio publicado

Puede forzar al editor de un flujo específico a dejar de publicar audio utilizando la opción Opentok.forceMuteStream(sessionId)método.

Puede forzar al editor de todos los flujos de una sesión (excepto una lista opcional de flujos) para que deje de publicar audio mediante la opción Opentok.forceMuteAll() método. A continuación, puedes desactivar el estado de silencio de la sesión llamando al Opentok.disableForceMute() método.

Trabajar con la interconexión SIP

Puedes añadir un flujo de solo audio procedente de una pasarela SIP externa de terceros mediante la función «Interconexión SIP». Para ello, se necesita un URI SIP, el ID de sesión al que deseas añadir el flujo de solo audio y un token para conectarte a ese ID de sesión.

var options = {
  from: "15551115555",
  secure: true,
};
opentok.dial(sessionId, token, sipUri, options, function (error, sipCall) {
  if (error) return console.log("error: ", error);

  console.log(
    "SIP audio stream Id: " +
      sipCall.streamId +
      " added to session ID: " +
      sipCall.sessionId
  );
});

Para más información, consulte el Guía para desarrolladores de OpenTok SIP Interconnect.

Obtener información sobre el flujo

Puedes obtener información sobre una transmisión activa en una sesión de OpenTok:

var sessionId =
  "2_MX6xMDB-fjE1MzE3NjQ0MTM2NzZ-cHVTcUIra3JUa0kxUlhsVU55cTBYL0Y1flB";
var streamId = "2a84cd30-3a33-917f-9150-49e454e01572";
opentok.getStream(sessionId, streamId, function (error, streamInfo) {
  if (error) {
    console.log(error.message);
  } else {
    console.log(stream.id); // '2a84cd30-3a33-917f-9150-49e454e01572'
    console.log(stream.videoType); // 'camera'
    console.log(stream.name); // 'Bob'
    console.log(stream.layoutClassList); // ['main']
  }
});

Pasa un identificador de sesión, un identificador de flujo y una función de devolución de llamada a la OpenTok.getStream() método. La función de devolución de llamada se ejecuta cuando finaliza la operación. Admite dos parámetros: error (en caso de error) o stream. Una vez completado con éxito, el stream objeto que contiene las propiedades del flujo.

Para obtener información sobre todos flujos activos en una sesión, llama a la función OpenTok.listStreams() método, pasándole un ID de sesión y una función de devolución de llamada. Si la operación se realiza con éxito, se invoca la función de devolución de llamada con un array de objetos Stream pasado como segundo parámetro:

opentok.listStreams(sessionId, function(error, streams) {
  if (error) {
    console.log(error.message);
  } else {
    streams.map(function(stream) {
      console.log(stream.id); // '2a84cd30-3a33-917f-9150-49e454e01572'
      console.log(stream.videoType); // 'camera'
      console.log(stream.name); // 'Bob'
      console.log(stream.layoutClassList); // ['main']
    }));
  }
});

Cómo trabajar con Audio Connector

Puedes iniciar un Conector de audio WebSocket mediante la llamada a la función OpenTok.websocketConnect() método.

Requisitos

Necesitas una clave API y un secreto API de OpenTok, que puedes obtener iniciando sesión en tu Cuenta API de Video de Vonage.

El SDK de OpenTok para Node requiere Node.js 6 o una versión superior. Es posible que funcione en versiones anteriores, pero estas ya no se someten a pruebas.

Notas de publicación

Véase el Página de comunicados de prensa para obtener más información sobre cada lanzamiento.

Cambios importantes desde la versión 2.2.0

Cambios en la versión 2.2.3:

La configuración predeterminada para el createSession() El método consiste en crear una sesión con el modo multimedia configurado en «relayed». En versiones anteriores del SDK, la configuración predeterminada era utilizar el OpenTok Media Router (modo multimedia configurado en «routed»). En una sesión de retransmisión, los clientes intentarán enviar flujos directamente entre ellos (punto a punto); si los clientes no pueden conectarse debido a restricciones del cortafuegos, la sesión utiliza el servidor TURN de OpenTok para retransmitir los flujos de audio y vídeo.

Cambios en la versión 2.2.0:

Esta versión del SDK incluye compatibilidad para trabajar con archivos de OpenTok.

El createSession() El método ha cambiado y ahora admite un parámetro: un options objeto que tiene location y mediaMode propiedades. El mediaMode La propiedad sustituye a la properties.p2p.preference parámetro de la versión anterior del SDK.

El generateToken() ha cambiado para aceptar dos parámetros: el ID de sesión y un options objeto que tiene role, expireTime y data propiedades.