Conector de vídeo

Vonage Video Connector te permite participar mediante programación en sesiones de la Video API de Vonage como participante del lado del servidor. Te permite conectarte a sesiones de vídeo, publicar y suscribirte a transmisiones, y procesar datos de audio y vídeo en tiempo real.

La biblioteca se encarga de la conectividad WebRTC, el procesamiento de medios y la gestión de sesiones de forma automática, lo que le permite centrarse en la creación de la lógica de su aplicación. en crear la lógica de su aplicación. El audio se transmite como datos PCM lineales de 16 bits, y el vídeo como fotogramas de 8 bits en formatos YUV420P, RGB24 o ARGB32. en formatos YUV420P, RGB24 o ARGB32, todo ello con frecuencias de muestreo, resoluciones y configuraciones de canal configurables.

Importante Vonage Video Connector está diseñado para aplicaciones del lado del servidor y requiere credenciales y tokens válidos de la Video API de Vonage con los permisos adecuados.

En esta página se describen los conceptos y el comportamiento comunes a todas las bibliotecas de Video Connector. Para obtener instrucciones de instalación, firmas de API y ejemplos de código, consulta la guía correspondiente a tu lenguaje de programación.

Elige tu biblioteca

Idioma Guía Paquete
Python Conector de vídeo para Python vonage-video-connector
Node.js Conector de vídeo para Node.js @vonage/video-connector

Ambas bibliotecas ofrecen las mismas funcionalidades y se basan en la misma implementación nativa. Se diferencian en las convenciones de nomenclatura y en la forma en que se exponen las operaciones asíncronas: la biblioteca de Python utiliza callbacks de finalización, mientras que la biblioteca de Node.js devuelve promesas. Las guías de los lenguajes describen estas diferencias con detalle.

Este tema incluye las siguientes secciones:

Cómo funciona

El Video Connector se une a una sesión como un participante habitual de WebRTC. Desde el punto de vista de los demás participantes, es indistinguible de un navegador o un cliente móvil: tiene su propia conexión, puede emitir un flujo y puede suscribirse a los flujos de los demás.

La diferencia radica en que los datos multimedia se intercambian con el código de tu aplicación, en lugar de con una cámara, un micrófono o una pantalla. Envías fotogramas de audio y vídeo sin procesar al conector para publicarlos, y recibes audio y vídeo sin procesar de las transmisiones a las que te suscribes. Esto hace que el conector sea adecuado para cargas de trabajo del lado del servidor, tales como:

  • Agentes de IA de voz y vídeo en tiempo real
  • Transcripción, traducción y subtitulado en directo
  • Registro, archivo y captura para el cumplimiento normativo
  • Visión artificial y moderación de contenidos
  • Tratamiento de efectos de audio y vídeo

El ciclo de vida habitual es el siguiente:

  1. Conéctate a una sesión utilizando tu ID de aplicación, tu ID de sesión y un token.
  2. Publica un flujo y, a continuación, envía fotogramas de audio y/o vídeo a dicho flujo.
  3. Suscríbete a las transmisiones de otros participantes a medida que vayan llegando y procesa los archivos multimedia que recibas.
  4. Darte de baja, eliminar la publicación y desconectarte cuando hayas terminado.

Requisitos

Video Connector se distribuye como una biblioteca nativa con binarios precompilados. Se ejecuta en Linux en x86_64 (AMD64) y ARM64 sólo.

Idioma Duración
Python Python 3.11 o posterior
Node.js Node.js 18 o posterior

Recomendamos Debian Bookworm, ya que es la distribución en la que el conector se ha probado más a fondo.

Conceptos fundamentales

Video Connector utiliza un pequeño conjunto de objetos para representar sesiones, participantes, transmisiones y contenidos multimedia. Es fundamental comprenderlos para poder trabajar de forma eficaz con cualquiera de las dos bibliotecas.

Sesión

Una sesión de la Video API de Vonage a la que se conectan los clientes. La sesión se identifica mediante su ID y se transmite a los controladores de eventos a nivel de sesión, lo que permite identificar qué sesión ha desencadenado un evento.

Conexión

La conexión de un participante a una sesión. Cada participante, incluido el propio conector, tiene exactamente una conexión. Una conexión transporta:

  • Un identificador único
  • Una marca de tiempo de creación
  • Los datos de conexión, que están codificados en el token utilizado para conectarse

Los datos de conexión resultan útiles para almacenar metadatos personalizados sobre los participantes, como los identificadores de usuario o los roles.

Transmisión

Una transmisión multimedia (audio, vídeo o ambos) publicada por un participante. Cada transmisión tiene un identificador único y una referencia a la conexión que la ha publicado. Se te notifican las transmisiones a medida que los participantes comienzan a publicarlas, y son a las que te suscribes para recibir contenido multimedia.

Editorial

Tu propio flujo publicado en la sesión. Hay como máximo un editor por instancia de conector. El editor mantiene una referencia al flujo que ha creado, que es como te ven los demás participantes.

Suscriptor

Una suscripción a la transmisión de otro participante. Se crea un suscriptor por cada transmisión de la que se deseen recibir contenidos multimedia, y cada suscriptor contiene una referencia a la transmisión a la que está suscrito. Los contenidos multimedia y los eventos de subtítulos se envían junto con el suscriptor que los ha generado, por lo que se puede saber de qué participante proceden los datos.

Cómo se relacionan

Session
├── Connection (multiple participants)
│   └── Stream (participant's published media)
│       ├── Publisher (your published stream)
│       └── Subscriber (your subscription to their stream)
├── Audio data (flowing through streams)
└── Video frames (flowing through streams)

Formatos multimedia

Audio

El audio siempre se transmite como PCM lineal, enteros con signo de 16 bits. Un fotograma de audio equivale a una muestra por canal, por lo que un búfer debe contener al menos (número de fotogramas × número de canales) muestras.

  • Tasas de muestreo: 8000, 12000, 16000, 24000, 32000, 44100 o 48000 Hz
  • Canales: 1 (mono) o 2 (estéreo)
  • Tamaño del marco: normalmente en bloques de 20 ms, aunque esto varía en función de la frecuencia de muestreo

La frecuencia de muestreo y el número de canales se pueden configurar de forma independiente para el audio que publicas y el audio mezclado que recibes. Consulta Configuración de la sesión.

Vídeo

El vídeo se comparte como Valores sin signo de 8 bits en uno de estos tres formatos de píxeles:

Formato Descripción Tamaño del búfer
YUV420P YUV planar con submuestreo de crominancia 4:2:0 width × height × 3 / 2
RGB24 RGB empaquetado, 8 bits por canal width × height × 3
ARGB32 ARGB comprimido, 8 bits por canal, incluido el canal alfa width × height × 4
  • Resoluciones: hasta 1920 x 1080 (2 073 600 píxeles en total)
  • Frecuencia de imagen: de 1 a 30 FPS

Configuración de la sesión

El audio para la publicación frente al audio para la suscripción

El conector te permite configurar dos formatos de audio independientes:

  • Audio del editor define el formato de los datos de audio que se proporcionan al publicar. El audio que se envíe debe coincidir con esta frecuencia de muestreo y este número de canales.
  • Mezcla de audio de los suscriptores define el formato del audio mezclado que recibes de todas las transmisiones a las que estás suscrito. La biblioteca se encarga de mezclar a varios participantes y de realizar el remuestreo o la conversión de canales para adaptarlos al formato que hayas solicitado.

Esta separación te permite optimizar la configuración según tu caso de uso. Por ejemplo:

  • Publica en estéreo para obtener un resultado de alta calidad y, al mismo tiempo, recibe una mezcla en mono para simplificar el procesamiento
  • Transmite a 16 kHz para voz y recibe a 48 kHz para una reproducción de alta fidelidad
  • Utiliza diferentes velocidades en cada lado para adaptarte a los requisitos de un proceso de procesamiento de audio

Resolución y frecuencia de fotogramas recomendadas para los suscriptores

Al suscribirse a transmisiones enrutadas que utilizan la emisión simultánea, la SFU (unidad de reenvío selectivo) de la Video API de Vonage puede enviar diferentes niveles de calidad del vídeo. La configuración del suscriptor te permite solicitar un nivel específico:

  • Resolución preferida solicita una capa espacial. El SFU envía la capa que más se ajusta a la solicitud.
  • Frecuencia de fotogramas recomendada solicita una capa temporal. La SFU envía la capa que más se ajusta a la solicitud.

Estas preferencias ayudan a optimizar el ancho de banda y el procesamiento por parte del abonado, ya que permiten solicitar únicamente el nivel de calidad que se necesita, en lugar de recibir siempre la máxima calidad disponible.

Migración de sesiones

Se puede activar la migración de sesión para que el conector se migre automáticamente en caso de rotación de la SFU. Está desactivada por defecto.

Tala de árboles

El nivel de detalle de los mensajes de registro de la consola se puede configurar en cinco niveles: ERROR, WARN, INFO, DEBUGy TRACE.

Medios de comunicación

Un servidor de publicación debe publicar contenido de audio, vídeo o ambos. Configurar un servidor de publicación sin ninguno de los dos constituye un error.

Esperando a que el audio esté listo

Importante Si vas a publicar audio, debes esperar al evento «audio-ready» antes de enviar los datos de audio. Este evento indica que el sistema de audio está inicializado y listo para aceptar datos. El audio enviado antes de ese momento se descartará. Este requisito no se aplica a la publicación de solo vídeo.

Continuidad del audio

Cuando publicas contenido de audio, la biblioteca mantiene una transmisión continua en tu nombre:

Primera publicación. La biblioteca envía silencio (tramas rellenadas con ceros) hasta que facilites tus primeros datos de audio. Esto hace que la transmisión esté disponible de inmediato para los suscriptores, sin tener que esperar a que tu aplicación genere audio.

Tolerancia al silencio. Si se interrumpe temporalmente la transmisión de audio, la biblioteca tolera breves interrupciones dejando de enviar paquetes de audio por completo. Esta histéresis evita el envío de paquetes de silencio innecesarios durante retrasos momentáneos en el procesamiento.

Silencio explícito. Una vez finalizado el periodo de tolerancia, si no hay audio nuevo disponible, la biblioteca pasa a enviar tramas de silencio explícito. De este modo se mantiene la transmisión, al tiempo que se indica que no se está proporcionando ningún audio activo.

Vaciado del búfer. Si se proporciona una cantidad de audio inferior a la correspondiente a un periodo completo, la biblioteca vacía los datos restantes y los rellena con silencio para mantener la sincronización correcta y evitar la deriva del audio.

Continuidad del vídeo

Cuando publicas un vídeo, la biblioteca se encarga de mantener la continuidad de los fotogramas por ti:

Primera publicación. La biblioteca envía fotogramas negros hasta que se proporciona el primer fotograma, de modo que la transmisión está disponible de inmediato para los suscriptores.

Repetición del último fotograma. Si dejas de enviar fotogramas, la biblioteca repite el último fotograma que has enviado durante un máximo de 2 segundos, lo que garantiza una reproducción fluida para los suscriptores.

Opción alternativa con marco negro. Tras 2 segundos de repetición, la biblioteca pasa a mostrar fotogramas en negro. Esto indica a los suscriptores que ya no se está transmitiendo el vídeo de forma activa, al tiempo que se mantiene activa la transmisión.

Buenas prácticas

  • Envía los datos multimedia a intervalos regulares que se ajusten a la frecuencia de muestreo y la frecuencia de fotogramas que hayas configurado.
  • Supervisa las estadísticas del búfer para asegurarte de que estás proporcionando suficientes datos
  • Gestiona el evento de agotamiento del búfer para detectar cuándo se agotan los búferes multimedia.
  • Adapta tu estrategia de generación de contenidos multimedia a las diferentes cargas de procesamiento

Suscripción a flujos

Cuando un participante empieza a publicar, se activa un evento de recepción de flujo y tú decides si deseas suscribirte. Los contenidos multimedia de tus suscripciones se distribuyen a través de tres canales distintos.

Vídeo se transmite por cada flujo. Cada fotograma llega acompañado de la información del suscriptor que identifica su origen, por lo que puedes procesar el vídeo de cada participante de forma independiente —para la gestión de la disposición, la grabación por flujo o la aplicación de efectos por flujo—.

Audio mixto se transmite como un único flujo a nivel de sesión. La biblioteca mezcla automáticamente el audio de todos los flujos a los que se está suscrito en un único flujo, en el formato que hayas configurado para la mezcla del suscriptor. No es posible distinguir a los participantes individuales en este audio mezclado.

Audio individual Se transmite por flujo, a nivel de suscriptor. El audio llega en el formato recibido del flujo —PCM lineal de 16 bits— y ni la frecuencia de muestreo ni el número de canales pueden configurarse antes de la recepción.

Leyendas se envían por cada flujo. Cada evento de subtítulo incluye el identificador del suscriptor que identifica el flujo de origen, el texto del subtítulo y si el resultado es definitivo o provisional:

  • Provisional Los resultados son parciales y pueden actualizarse a medida que se procesen más datos de voz. Útil para la visualización en directo.
  • Final Los resultados son definitivos y no cambiarán. Utilízalos para su almacenamiento o para su procesamiento posterior.

Nota Para recibir datos de subtítulos, es necesario habilitar los subtítulos en directo en la configuración de la sesión de la Video API de Vonage subyacente (fuera de esta biblioteca; consulta la Video API de Vonage Subtítulos en directo documentación) y para el flujo específico del emisor que está enviando audio.

Gestión de la memoria intermedia

El conector mantiene búferes internos para el audio y el vídeo que publicas. Puedes consultar la cantidad de contenido multimedia en cola en cualquier momento y vaciar ambos búferes cuando necesites descartar el contenido pendiente; por ejemplo, cuando interrumpas a un bot en mitad de una expresión oral.

Eventos de vaciado del búfer

Un evento de agotamiento del búfer se activa cuando se agota un búfer interno de audio o vídeo. Esto ocurre cuando el contenido multimedia se transmite a la sesión a un ritmo más rápido del que tu aplicación es capaz de suministrar. Considera este evento como una señal para aumentar tu ritmo de producción de contenido multimedia o ajustar tu estrategia de publicación.

El evento aplica histéresis para evitar una activación excesiva: tras un vaciado inicial, no se activará de nuevo hasta que el búfer se haya rellenado con nuevos contenidos y, posteriormente, se vuelva a vaciar. Esto evita una avalancha de notificaciones repetidas mientras el búfer permanezca vacío.

Modelo de eventos

Ambas bibliotecas exponen el mismo conjunto de eventos, agrupados según el objeto al que pertenecen.

Ámbito de aplicación Evento Se dispara cuando
Sesión Error Se produce un error a nivel de sesión
Sesión Conectado Se ha establecido la conexión con la sesión
Sesión Desconectado Se cierra la conexión a la sesión
Sesión Conexión creada Se une otro participante
Sesión Se ha interrumpido la conexión Se marcha otro participante
Sesión Se ha recibido el flujo Un participante empieza a publicar
Sesión Se ha interrumpido la transmisión Se elimina la transmisión de un participante
Sesión Datos de audio Está disponible el audio mezclado de todas las transmisiones a las que estás suscrito
Sesión Listo para el audio El sistema de audio está preparado para reproducir archivos de audio publicados
Sesión Se ha agotado el búfer de medios Se ha agotado un búfer de publicación
Editorial Error Se produce un error a nivel de editor
Editorial Se ha creado el flujo Se ha creado tu transmisión publicada
Editorial Corriente destruida Tu transmisión publicada se ha eliminado
Suscriptor Error Se produce un error a nivel de suscriptor
Suscriptor Conectado La suscripción ya está activada
Suscriptor Desconectado La suscripción finaliza
Suscriptor Fotograma de renderizado Hay un fotograma de vídeo disponible de la transmisión
Suscriptor Datos de audio El audio individual está disponible en la retransmisión
Suscriptor Texto de la leyenda Se recibe el texto de los subtítulos desde la transmisión

La forma en que se muestran estos eventos varía según el lenguaje. En Python, cada evento es una función de devolución de llamada que se registra. En Node.js, los eventos de ciclo de vida de una sola ejecución —conexión de sesión, creación de un flujo de editor y conexión de suscriptor— son consumidos por la promesa devuelta por el método correspondiente, y el resto de eventos son funciones de devolución de llamada. Consulta las guías de cada lenguaje para obtener más detalles.

Límites

Propiedad Límite
Plataformas Linux x86_64 y ARM64
Frecuencias de muestreo de audio 8 000, 12 000, 16 000, 24 000, 32 000, 44 100, 48 000 Hz
Canales de audio 1 o 2
Formato de muestra de audio PCM lineal, 16 bits con signo
Formatos de vídeo YUV420P, RGB24, ARGB32
Formato de muestra de vídeo 8 bits sin signo
Resolución máxima de vídeo 1920 x 1080 (2 073 600 píxeles)
Frecuencia de fotogramas del vídeo De 1 a 30 FPS
Editoriales por instancia 1
Instancias de conector por proceso 1