Articulo de referencia

Protocolo de mensajería en tiempo real

El Protocolo de Mensajería en Tiempo Real ( RTMP ) es un protocolo de comunicación para la transmisión de audio, vídeo y datos a través de Internet. Originalmente desarrollado c...

El Protocolo de Mensajería en Tiempo Real ( RTMP ) es un protocolo de comunicación para la transmisión de audio, vídeo y datos a través de Internet. Originalmente desarrollado como un protocolo propietario por Macromedia para la transmisión entre Flash Player y el Flash Communication Server, Adobe (que adquirió Macromedia) ha publicado una versión incompleta de la especificación del protocolo para uso público.

El protocolo RTMP tiene múltiples variaciones:

  1. RTMP propiamente dicho, el protocolo "simple" que funciona sobre el Protocolo de Control de Transmisión (TCP) y utiliza el puerto número 1935 por defecto.
  2. RTMPS, que es RTMP sobre una conexión de seguridad de la capa de transporte (TLS/SSL).
  3. RTMPE, que es RTMP cifrado mediante el mecanismo de seguridad propio de Adobe. Si bien los detalles de la implementación son propiedad de la empresa, el mecanismo utiliza primitivas criptográficas estándar de la industria. [ 1 ]
  4. RTMPT, que se encapsula dentro de solicitudes HTTP para atravesar cortafuegos , se utiliza frecuentemente mediante solicitudes en texto plano en los puertos TCP 80 y 443 para eludir la mayoría de los filtros de tráfico corporativos. La sesión encapsulada puede contener paquetes RTMP, RTMPS o RTMPE sin cifrar.
  5. RTMFP, que utiliza RTMP sobre el Protocolo de Datagramas de Usuario (UDP) en lugar de TCP, reemplaza a RTMP Chunk Stream. El conjunto de protocolos Secure Real-Time Media Flow ha sido desarrollado por Adobe Systems y permite a los usuarios finales conectarse y comunicarse directamente entre sí (P2P).
  6. E-RTMP, o RTMP mejorado, es una mejora de las especificaciones RTMP y FLV diseñada para optimizar las capacidades de transmisión manteniendo la compatibilidad con la infraestructura RTMP existente. [ 2 ] E-RTMP mejora RTMP añadiendo características como precisión avanzada de marcas de tiempo, capacidades multipista, compatibilidad ampliada con códecs, señalización FourCC y una función de solicitud de reconexión.

Si bien la principal motivación para RTMP era ser un protocolo para reproducir vídeo Flash , también se utiliza en otras aplicaciones, como Adobe LiveCycle Data Services ES .

Operación básica

RTMP es un protocolo basado en TCP que mantiene conexiones persistentes y permite una comunicación de baja latencia. Para entregar flujos de datos sin problemas y transmitir la mayor cantidad de información posible, divide los flujos en fragmentos, cuyo tamaño se negocia dinámicamente entre el cliente y el servidor. En ocasiones, se mantiene sin cambios; los tamaños de fragmento predeterminados son 64 bytes para datos de audio y 128 bytes para datos de video y la mayoría de los demás tipos de datos. Los fragmentos de diferentes flujos pueden intercalarse y multiplexarse ​​a través de una sola conexión. Con bloques de datos más largos, el protocolo transporta solo una cabecera de un byte por fragmento, lo que genera una sobrecarga mínima . Sin embargo, en la práctica, los fragmentos individuales no suelen intercalarse. En cambio, el intercalado y la multiplexación se realizan a nivel de paquete, y los paquetes RTMP de varios canales activos se intercalan de tal manera que cada canal cumpla con sus requisitos de ancho de banda, latencia y otros requisitos de calidad de servicio. Los paquetes intercalados de esta manera se tratan como indivisibles y no se intercalan a nivel de fragmento.

El protocolo RTMP define varios canales virtuales a través de los cuales se pueden enviar y recibir paquetes, y que operan de forma independiente. Por ejemplo, existe un canal para gestionar las solicitudes y respuestas RPC, un canal para datos de transmisión de vídeo, un canal para datos de transmisión de audio, un canal para mensajes de control fuera de banda (negociación del tamaño de fragmento, etc.), y así sucesivamente. Durante una sesión RTMP típica, varios canales pueden estar activos simultáneamente. Al codificar los datos RTMP, se genera una cabecera de paquete. Esta cabecera especifica, entre otros aspectos, el ID del canal por el que se enviará, una marca de tiempo de su generación (si es necesario) y el tamaño de la carga útil del paquete. A continuación, se incluye el contenido de la carga útil del paquete, que se fragmenta según el tamaño de fragmento acordado antes de su envío a través de la conexión. La cabecera del paquete nunca se fragmenta y su tamaño no se tiene en cuenta para los datos del primer fragmento. En otras palabras, solo la carga útil del paquete (los datos multimedia) está sujeta a fragmentación.

En un nivel superior, RTMP encapsula flujos multimedia de audio MP3 o AAC y vídeo FLV1 , y puede realizar llamadas a procedimientos remotos (RPC) utilizando el formato de mensaje de acción . Cualquier servicio RPC requerido se realiza de forma asíncrona, utilizando un único modelo de solicitud/respuesta cliente/servidor, de modo que no se requiere comunicación en tiempo real . [ 3 ] [ 4 ]

Cifrado

Las sesiones RTMP pueden cifrarse utilizando cualquiera de los dos métodos siguientes:

  • Utilizando mecanismos TLS/SSL estándar de la industria , la sesión RTMP subyacente simplemente se encapsula dentro de una sesión TLS/SSL normal.
  • Utilizando RTMPE, que encapsula la sesión RTMP en una capa de cifrado más ligera.

Túnel HTTP

En RTMP Tunneled (RTMPT), los datos RTMP se encapsulan y se intercambian a través de HTTP , y los mensajes del cliente (el reproductor multimedia, en este caso) se dirigen al puerto 80 (el predeterminado para HTTP) en el servidor.

Si bien los mensajes en RTMPT son más grandes que los mensajes RTMP equivalentes sin túnel debido a los encabezados HTTP, RTMPT puede facilitar el uso de RTMP en escenarios donde el uso de RTMP sin túnel no sería posible de otro modo, como cuando el cliente está detrás de un cortafuegos que bloquea el tráfico saliente que no es HTTP ni HTTPS.

El protocolo funciona enviando comandos a través de la URL POST y mensajes AMF a través del cuerpo POST. Un ejemplo es

POST /open/1 HTTP/1.1

para que se abra una conexión.

Documento de especificaciones y licencia de patente

Adobe publicó una especificación para la versión 1.0 del protocolo, con fecha del 21 de diciembre de 2012. [ 5 ] La página web que lleva a dicha especificación señala que "Para beneficio de los clientes que desean proteger su contenido, la especificación RTMP abierta no incluye las medidas de seguridad RTMP exclusivas de Adobe". [ 6 ]

Un documento que acompaña a la especificación de Adobe otorga una licencia de patente "no exclusiva, libre de regalías, intransferible, no sublicenciable, personal y mundial" a todas las implementaciones del protocolo, con dos restricciones: una prohíbe su uso para interceptar datos en streaming ("cualquier tecnología que intercepte contenido de vídeo, audio y/o datos en streaming para su almacenamiento en cualquier dispositivo o medio"), y la otra prohíbe la elusión de "medidas tecnológicas para la protección de contenido de audio, vídeo y/o datos, incluidas cualquiera de las medidas seguras RTMP de Adobe". [ 7 ]

Stefan Richter, autor de algunos libros sobre Flash , señaló en 2008 que, si bien Adobe es vago en cuanto a qué patentes se aplican a RTMP, la patente estadounidense 7,246,356 parece ser una de ellas. [ 3 ]

En 2011, Adobe demandó a Wowza Media Systems alegando, entre otras cosas, infracción de sus patentes RTMP. [ 8 ] [ 9 ] [ 10 ] En 2015, Adobe y Wowza anunciaron que las demandas se habían resuelto y desestimado con carácter definitivo. [ 11 ]

Estructura del paquete

Diagrama de paquetes RTMP

Los paquetes se envían a través de una conexión TCP, que se establece primero entre el cliente y el servidor. Contienen una cabecera y un cuerpo que, en el caso de comandos de conexión y control, se codifica utilizando el formato de mensaje de acción (AMF). La cabecera se divide en la cabecera básica (que se muestra separada del resto en el diagrama) y la cabecera del mensaje de fragmento . La cabecera básica es la única parte constante del paquete y generalmente se compone de un único byte compuesto , donde los dos bits más significativos son el tipo de fragmento ( fmt en la especificación) y el resto forma el ID de flujo. Dependiendo del valor del primero, algunos campos de la cabecera del mensaje pueden omitirse y su valor derivarse de paquetes anteriores; mientras que, dependiendo del valor del segundo, la cabecera básica puede extenderse con uno o dos bytes adicionales (como en el caso del diagrama que tiene tres bytes en total (c)). Si el valor de los seis bits restantes del encabezado básico (BH) (menos significativo) es 0, entonces el BH es de dos bytes y representa desde el ID de flujo 64 hasta el 319 (64+255); si el valor es 1, entonces el BH es de tres bytes (con los dos últimos bytes codificados como Little Endian de 16 bits) y representa desde el ID de flujo 64 hasta el 65599 (64+65535); si el valor es 2, entonces el BH es de un byte y está reservado para mensajes y comandos de control de protocolo de bajo nivel. El encabezado del mensaje de fragmento contiene información de metadatos como el tamaño del mensaje (medido en bytes), el delta de marca de tiempo y el tipo de mensaje . Este último valor es un solo byte y define si el paquete es un paquete RTMP de audio, video, comando o de "bajo nivel" como un ping RTMP.

A continuación se muestra un ejemplo capturado cuando un cliente Flash ejecuta el siguiente código:

var flujo : NetStream = nuevo NetStream ( objeto de conexión );

Esto generará el siguiente fragmento:

El paquete comienza con una cabecera básica de un solo byte (0x03) donde los dos bits más significativos (b 00 000011) definen un tipo de cabecera de fragmento de 0, mientras que el resto (b00 000011 ) definen un ID de flujo de fragmento de 3. Los cuatro valores posibles del tipo de cabecera y su significado son:

  • b00 = encabezado de 12 bytes (encabezado completo).
  • b01 = 8 bytes - como el tipo b00, sin incluir el ID del mensaje (los últimos 4 bytes).
  • b10 = 4 bytes: se incluyen el encabezado básico y la marca de tiempo (3 bytes).
  • b11 = 1 byte: solo se incluye el encabezado básico.

El último tipo (b11) se usa siempre en el caso de mensajes agregados donde, en el ejemplo anterior, el segundo mensaje comenzará con un id de 0xC3 (b11000011) y significaría que todos los campos del encabezado del mensaje deben derivarse del mensaje con un ID de flujo de 3 (que sería el mensaje inmediatamente superior). Los seis bits menos significativos que forman el ID de flujo pueden tomar valores entre 3 y 63. Algunos valores tienen un significado especial, como 1 que representa un formato de ID extendido, en cuyo caso habrá dos bytes después de eso. Un valor de dos es para mensajes de bajo nivel como Ping y Set Client Bandwidth.

Los siguientes bytes del encabezado RTMP (incluidos los valores del paquete de ejemplo anterior) se decodifican de la siguiente manera:

  • byte #1 (0x03) = Tipo de encabezado de bloque.
  • byte #2–4 (0x000b68) = Delta de marca de tiempo.
  • byte #5–7 (0x000019) = Longitud del paquete - en este caso es 0x000019 = 25 bytes.
  • byte #8 (0x14) = ID de tipo de mensaje - 0x14 (20) define un mensaje de comando codificado en AMF0 .
  • byte #9–12 (0x00000000) = ID del flujo de mensajes. Está en orden little-endian.

El byte de ID de tipo de mensaje define si el paquete contiene datos de audio/vídeo, un objeto remoto o un comando. Algunos valores posibles son:

  • 0x01 = Establecer mensaje de tamaño de paquete.
  • 0x02 = Abortar.
  • 0x03 = Confirmar.
  • 0x04 = Mensaje de control.
  • 0x05 = Ancho de banda del servidor
  • 0x06 = Ancho de banda del cliente.
  • 0x07 = Control virtual.
  • 0x08 = Paquete de audio.
  • 0x09 = Paquete de vídeo.
  • 0x0F = Datos extendidos.
  • 0x10 = Contenedor extendido.
  • 0x11 = Comando extendido (un comando de tipo AMF3).
  • 0x12 = Datos (Invocar (la información de onMetaData se envía como tal)).
  • 0x13 = Contenedor.
  • 0x14 = Comando (Un comando de tipo AMF0).
  • 0x15 = UDP
  • 0x16 = Agregado
  • 0x17 = Present

Tras el encabezado, 0x02 indica una cadena de tamaño 0x000C con valores 0x63, 0x72 y 0x6D (comando "createStream"). A continuación, encontramos 0x00 (número), que corresponde al ID de transacción con valor 2.0. El último byte es 0x05 (nulo), lo que significa que no hay argumentos.

Estructura del mensaje de invocación (0x14, 0x11)

Algunos de los tipos de mensajes mostrados anteriormente, como Ping y Establecer ancho de banda cliente/servidor, se consideran mensajes de protocolo RTMP de bajo nivel que no utilizan el formato de codificación AMF. Los mensajes de comando, por otro lado, ya sean AMF0 (tipo de mensaje 0x14) o AMF3 (0x11), utilizan el formato y tienen la forma general que se muestra a continuación:

(Cadena) <Nombre del comando> (Número) <ID de transacción> (Mixto) <Argumento> ej. Nulo, Cadena, Objeto: {clave1:valor1, clave2:valor2 ... } 

El ID de transacción se utiliza para comandos que pueden tener una respuesta. El valor puede ser una cadena de texto, como en el ejemplo anterior, o uno o más objetos, cada uno compuesto por un conjunto de pares clave/valor, donde las claves siempre se codifican como cadenas de texto, mientras que los valores pueden ser de cualquier tipo de datos AMF, incluidos tipos complejos como matrices.

Estructura del mensaje de control (0x04)

Los mensajes de control no están codificados en AMF. Comienzan con un ID de flujo de 0x02, lo que implica una cabecera completa (tipo 0), y tienen un tipo de mensaje de 0x04. La cabecera va seguida de seis bytes, que se interpretan de la siguiente manera:

  • #0–1 - Tipo de control.
  • #2–3 - Segundo parámetro (esto tiene significado en tipos de control específicos)
  • #4–5 - Tercer parámetro (igual)

Los dos primeros bytes del cuerpo del mensaje definen el tipo de ping, que aparentemente [ 12 ] puede tomar seis valores posibles.

  • Tipo 0 - Flujo limpio: Se envía cuando se establece la conexión y no contiene más datos.
  • Tipo 1 - Borrar el búfer.
  • Tipo 2 - Arroyo seco.
  • Tipo 3: Tiempo de búfer del cliente. El tercer parámetro contiene el valor en milisegundos.
  • Tipo 4 - Reiniciar una transmisión.
  • Tipo 6: Hacer ping al cliente desde el servidor. El segundo parámetro es la hora actual.
  • Tipo 7: Respuesta Pong del cliente. El segundo parámetro es el momento en que el cliente recibe el Ping.
  • Tipo 8 - Solicitud UDP.
  • Tipo 9 - Respuesta UDP.
  • Tipo 10 - Límite de ancho de banda.
  • Tipo 11 - Ancho de banda.
  • Tipo 12 - Ancho de banda del acelerador.
  • Tipo 13 - Flujo creado.
  • Tipo 14 - Transmisión eliminada.
  • Tipo 15 - Establecer acceso de lectura.
  • Tipo 16 - Establecer acceso de escritura.
  • Tipo 17 - Solicitud de metadatos de transmisión.
  • Tipo 18 - Respuesta de metadatos de flujo.
  • Tipo 19 - Obtener límite de segmento.
  • Tipo 20 - Establecer límite de segmento.
  • Tipo 21 - Al desconectarse.
  • Tipo 22 - Establecer enlace crítico.
  • Tipo 23 - Desconectar.
  • Tipo 24 - Actualización de hash.
  • Tipo 25 - Tiempo de espera agotado para el hash.
  • Tipo 26 - Solicitud de hash.
  • Tipo 27 - Respuesta Hash.
  • Tipo 28 - Comprobar ancho de banda.
  • Tipo 29 - Configurar acceso a muestras de audio.
  • Tipo 30 - Configurar acceso a muestras de vídeo.
  • Tipo 31 - Inicio del acelerador.
  • Tipo 32 - Extremo del acelerador.
  • Tipo 33 - Notificar DRM.
  • Tipo 34 - Sincronización RTMFP.
  • Tipo 35 - Consulta IHola.
  • Tipo 36 - Reenvío IHola.
  • Tipo 37 - Redirigir IHello.
  • Tipo 38 - Notificar EOF.
  • Tipo 39 - Continuar por proxy.
  • Tipo 40 - Eliminar proxy ascendente.
  • Tipo 41 - RTMFP Configurar Keepalives.
  • Tipo 46 - Segmento no encontrado.

Pong es el nombre que recibe la respuesta a un Ping, con los valores utilizados como se muestra arriba.

Estructura del mensaje ServerBw/ClientBw (0x05, 0x06)

Esto se refiere a los mensajes relacionados con la velocidad de bits de subida del cliente y de bajada del servidor. El cuerpo consta de cuatro bytes que muestran el valor del ancho de banda, con una posible extensión de un byte que establece el tipo de límite. Este puede tener uno de tres valores posibles: estricto, flexible o dinámico (flexible o estricto).

Establecer tamaño de fragmento (0x01)

El valor recibido en los cuatro bytes del cuerpo. Existe un valor predeterminado de 128 bytes, y el mensaje se envía solo cuando se desea realizar un cambio.

Protocolo

Diagrama de protocolo de enlace RTMP

Apretón de manos

Tras establecer una conexión TCP, primero se establece una conexión RTMP, realizando un protocolo de enlace mediante el intercambio de tres paquetes de cada extremo (también denominados Chunks en la documentación oficial). Estos se denominan C0-2 para los paquetes enviados por el cliente y S0-2 para los del servidor, respectivamente, y no deben confundirse con los paquetes RTMP, que solo se intercambian una vez completado el protocolo de enlace. Estos paquetes tienen su propia estructura, y C1 contiene un campo que establece la marca de tiempo "epoch". Sin embargo, dado que este valor puede establecerse en cero, como se hace en implementaciones de terceros, el paquete se puede simplificar. El cliente inicializa la conexión enviando el paquete C0 con un valor constante de 0x03 que representa la versión actual del protocolo. A continuación, envía directamente C1 sin esperar a recibir primero S0, que contiene 1536 bytes: los cuatro primeros representan la marca de tiempo epoch, los cuatro siguientes son 0 y el resto son aleatorios (y pueden establecerse en 0 en implementaciones de terceros). C2 y S2 son un eco de S1 y C1 respectivamente, con la diferencia de que los últimos cuatro bytes indican la hora en que se recibió el mensaje correspondiente (en lugar de 0). Una vez recibidos C2 y S2, se considera que el protocolo de enlace ha finalizado.

Conectar

En este punto, el cliente y el servidor pueden negociar una conexión mediante el intercambio de mensajes codificados en AMF . Estos incluyen pares clave-valor relacionados con las variables necesarias para establecer la conexión. Un ejemplo de mensaje del cliente es:

( Invocar ) "conectar" ( ID de transacción ) 1.0 ( Objeto1 ) { app : "muestra" , flashVer : "MAC 10,2,153,2" , swfUrl : null , tcUrl : "rtmpt://127.0.0.1/muestra " , fpad : false , capabilities : 9947.75 , audioCodecs : 3191 , videoCodecs : 252 , videoFunction : 1 , pageUrl : null , objectEncoding : 3.0 }

El servidor Flash Media Server y otras implementaciones utilizan el concepto de "aplicación" para definir conceptualmente un contenedor para audio/vídeo y otro contenido, implementado como una carpeta en la raíz del servidor que contiene los archivos multimedia que se transmitirán. La primera variable contiene el nombre de esta aplicación como "sample", que es el nombre proporcionado por el servidor Wowza para sus pruebas. La cadena es la misma que devuelve la función flashVerActionScript . y están codificados como doubles y su significado se puede encontrar en la especificación original. Lo mismo ocurre con la variable, que en este caso es la constante autoexplicativa SUPPORT_VID_CLIENT_SEEK . De especial interés es que definirá si el resto de la comunicación utilizará el formato AMF3 extendido o no. Como la versión 3 es la predeterminada actual, se debe indicar explícitamente al cliente Flash en el código ActionScript que utilice AMF0 si se solicita. El servidor responde entonces con una secuencia de mensajes ServerBW, ClientBW y SetPacketSize, seguida finalmente de un Invoke, con un mensaje de ejemplo.getversion()audioCodecvideoCodecvideoFunctionobjectEncoding

( Invocar ) "_resultado" ( ID de transacción ) 1.0 ( Objeto1 ) { fmsVer : "FMS/3,5,5,2004" , capabilities : 31.0 , mode : 1.0 } ( Objeto2 ) { level : "estado" , code : "NetConnection.Connect.Success" , description : "Conexión exitosa" , data : ( array ) { version : "3,5,5,2004" }, clientId : 1728724019 , objectEncoding : 3.0 }

Algunos de los valores anteriores se serializan en propiedades de un objeto ActionScript genérico, que luego se pasa al oyente de eventos NetConnection. Esto clientIdestablecerá un número para la sesión que iniciará la conexión. La codificación del objeto debe coincidir con el valor configurado previamente.

Reproducir video

Para iniciar una transmisión de video, el cliente envía una llamada a "createStream" seguida de un mensaje de ping, y luego una llamada a "play" con el nombre del archivo como argumento. El servidor responderá con una serie de comandos "onStatus" seguidos de los datos de video encapsulados en mensajes RTMP.

Una vez establecida la conexión, el contenido multimedia se envía encapsulando el contenido de las etiquetas FLV en mensajes RTMP de tipo 8 y 9 para audio y vídeo, respectivamente.

Protocolos superpuestos

Túnel HTTP (RTMPT)

Esto se refiere a la versión tunelizada HTTP del protocolo. Se comunica a través del puerto 80 y transmite los datos AMF dentro de las solicitudes y respuestas HTTP POST. La secuencia de conexión es la siguiente:

POST /fcs/ident2 HTTP / 1.1 Content-Type : application/x-fcs\r\n HTTP/1.0 404 No encontrado 
POST /open/1 HTTP / 1.1 Content-Type : application/x-fcs\r\n HTTP/1.1 200 OK Tipo de contenido: aplicación/x-fcs\r\n 1728724019 

La primera solicitud tiene una /fcs/ident2ruta, y la respuesta correcta es un error 404 Not Found. A continuación, el cliente envía una solicitud /open/1, a la que el servidor debe responder con un 200 ok, añadiendo un número aleatorio que se utilizará como identificador de sesión para dicha comunicación. En este ejemplo, se devuelve 1728724019 en el cuerpo de la respuesta.

POST /idle/1728724019/0 HTTP / 1.1 HTTP/1.1 200 OK 0x01

De ahora en adelante, se /idle/<session id>/<sequence #>trata de una solicitud de sondeo donde el ID de sesión se ha generado y devuelto desde el servidor y la secuencia es simplemente un número que se incrementa en uno para cada solicitud. La respuesta apropiada es un 200 OK, con un entero devuelto en el cuerpo que indica el tiempo del intervalo. Los datos AMF se envían a través de/send/<session id>/<sequence #>

Implementaciones de software

RTMP se implementa en estas tres etapas:

  • Codificador de vídeo en directo
  • Servidor de transmisión de contenido multimedia en directo y bajo demanda
  • Cliente en vivo y bajo demanda

rtmpdump

La herramienta de línea de comandos de código abierto RTMP, rtmpdump, está diseñada para reproducir o guardar en disco la transmisión RTMP completa, incluyendo el protocolo RTMPE que Adobe utiliza para el cifrado. RTMPdump funciona en Linux, Android, Solaris, Mac OS X y la mayoría de los demás sistemas operativos derivados de Unix, así como en Microsoft Windows. Originalmente compatible con todas las versiones de Windows de 32 bits, incluyendo Windows 98, a partir de la versión 2.2 el software solo funcionará en Windows XP y versiones posteriores (aunque las versiones anteriores siguen siendo totalmente funcionales).

Los paquetes del conjunto de software rtmpdump están disponibles en los principales repositorios de código abierto (distribuciones Linux). Estos incluyen las aplicaciones de interfaz "rtmpdump", "rtmpsrv" y "rtmpsuck".

El desarrollo de RTMPdump se reinició en octubre de 2009, fuera de Estados Unidos, en el sitio de MPlayer . [ 13 ] La versión actual presenta una funcionalidad notablemente mejorada y se ha reescrito para aprovechar las ventajas del lenguaje de programación C. En particular, la funcionalidad principal se integró en una biblioteca (librtmp) que otras aplicaciones pueden utilizar fácilmente. Los desarrolladores de RTMPdump también han creado soporte para librtmp para MPlayer , FFmpeg , XBMC , cURL , VLC y otros proyectos de software de código abierto. El uso de librtmp proporciona a estos proyectos soporte completo para RTMP en todas sus variantes sin ningún esfuerzo de desarrollo adicional.

FLVstreamer

FLVstreamer es una bifurcación de RTMPdump, sin el código que, según Adobe, infringe la DMCA en Estados Unidos. Se desarrolló como respuesta al intento de Adobe en 2008 de suprimir RTMPdump. FLVstreamer es un cliente RTMP que guarda en disco una transmisión de audio o vídeo desde cualquier servidor RTMP, siempre que el cifrado (RTMPE) no esté habilitado.

Extensiones

Las variantes mencionadas anteriormente son añadidos realizados sobre RTMP. Sin embargo, la limitada selección de códecs de FLV y RTMP ha obligado a la industria a incorporar elementos directamente al formato y al protocolo.

Extensión ad hoc

RTMP utiliza internamente su propio "ID de códec" de cuatro bits en lugar del estándar FourCC para identificar el conjunto de códecs que admite. Los ID de códec de audio y vídeo se consideran en espacios de nombres diferentes, por lo que usar el mismo valor no causa ningún conflicto: por ejemplo, en el estándar base de Adobe, el códec de audio 7 es G.711A y el códec de vídeo 7 es H.264.

En China, Kingsoft Cloud asignó H.265 al códec de vídeo "12" en 2018, una práctica que pronto fue adoptada por otros actores de la industria como Bilibili . En 2020, Xia Chu de ZLMediaKit asignó Opus al códec de audio 13. [ 14 ]

E-RTMP ha dejado obsoletas todas las adiciones ad hoc al campo de ID codificado. E-RTMP no reutiliza los ID 12 y 13, lo que lo hace compatible con las extensiones ad hoc chinas.

RTMP mejorado

El RTMP mejorado (E-RTMP) es una mejora de las especificaciones del Protocolo de Mensajería en Tiempo Real (RTMP) y FLV , que moderniza los flujos de trabajo de transmisión manteniendo la compatibilidad con la infraestructura RTMP existente. [ 2 ] Desarrollado como una especificación abierta, E-RTMP fue publicado por la Organización de Software Veovera, con contribuciones de Adobe , Google , Twitch y otros.

Las mejoras introducidas en E-RTMP incluyen:

  • Nuevos formatos de encabezado de audio y video FLV, que se indican mediante partes reservadas de los formatos de encabezado originales.
    • Los encabezados antiguos usaban enteros de cuatro bits para identificar los tipos de códec, lo que limitaba la extensibilidad. El nuevo formato usa números FourCC para identificar los nuevos códecs. Las opciones estándar incluyen AC-3 , E-AC-3 , Opus y FLAC para audio, y VP8 , VP9 , ​​HEVC y AV1 con capacidades HDR para video, aunque se puede usar cualquier códec con un identificador FourCC acordado.
    • Los nuevos encabezados incluyen marcas de tiempo con precisión de nanosegundos para una mejor sincronización con los formatos multimedia modernos.
    • Los nuevos encabezados incluyen la capacidad de describir una configuración multipista, lo que permite el procesamiento simultáneo de audio, vídeo y metadatos dentro de una única secuencia.
    • El nuevo encabezado de audio puede describir configuraciones de audio multicanal, lo que resulta más flexible.
    • El nuevo encabezado de vídeo utiliza tipos de paquetes en lugar de tipos de tramas. Uno de estos tipos VideoPacketType.Metadatapermite escribir cualquier metadato de vídeo en formato de mensaje de acción (AMF). (AMF se utiliza en el protocolo RTMP original en la capa de mensajería, no como parte del flujo de vídeo FLV).
  • Anuncio de nuevas funcionalidades de códecs en formato FourCC.
  • Nuevos campos para onMetaData, un mecanismo de metadatos existente en RTMP (el uso actual de AMF).
  • Una función de solicitud de reconexión para mejorar la estabilidad y la resistencia de la conexión en los flujos de trabajo de transmisión de contenido.

E-RTMP mejora las capacidades de RTMP al tiempo que garantiza la interoperabilidad con las implementaciones de RTMP existentes. Por ejemplo, un decodificador antiguo no sabría cómo decodificar tramas que contengan encabezados reservados ("nuevos"), pero aun así podría reenviarlas correctamente.

Debido a que muchos cambios en E-RTMP se realizan en la capa de formato FLV, E-RTMP también incluye una extensión al formato de archivo FLV que se puede usar independientemente de E-RTMP. ffmpeg llama a este formato "FLV mejorado". [ 15 ]

Implementaciones

Productores:

Ingeridores:

Ingeridores, solo Enhanced-FLV:

  • e-flv-js, bifurcación de Veovera de flv-js (originalmente de Bilibili ). El autor de flv-js también tiene su propia bifurcación, mpegts.js, con cierto soporte para Enhanced-FLV. [ 19 ]

Véase también

Referencias

  1. "RTMPE" . Ayuda de Adobe Flash Lite 4. Adobe. Archivado del original el 4 de diciembre de 2017. Consultado el 29 de diciembre de 2013 .
  2. 1 2 Lozben, Slavik (21 de enero de 2025). "RTMP mejorado (V2)" . Veovera Software Organization . Recuperado el 25 de febrero de 2025 .
  3. 1 2 "TheRealTimeWeb.com: Adobe patenta RTMP" . therealtimeweb.com . Archivado del original el 21 de febrero de 2020. Recuperado el 4 de agosto de 2014 .
  4. "Uso de servicios RPC en Flex Data Services 2" . Adobe DevNet . Adobe. Archivado del original el 3 de abril de 2007. Consultado el 16 de abril de 2007 .
  5. H. Parmar, M. Thornburgh (eds.) Protocolo de mensajería en tiempo real de Adobe , Adobe, 21 de diciembre de 2012
  6. "Especificación del protocolo de mensajería en tiempo real (RTMP)" . Archivado del original el 21 de agosto de 2014. Consultado el 8 de mayo de 2014 .
  7. Licencia de especificación RTMP , publicada en abril de 2009
  8. Schumacher-Rasmussen, Eric (27 de mayo de 2011). "Wowza niega las acusaciones de Adobe de infracción de patentes" . streamingmedia.com .
  9. Lawler, Ryan (31 de mayo de 2011). "Wowza contraataca a Adobe en una demanda por patentes de Flash" . gigaom.com . Archivado del original el 21 de febrero de 2013.
  10. "ADOBE SYSTEMS INCORPORATE - No. C 11-2243 CW. - 20120907565 - Leagle.com" . leagle.com .
  11. Wowza Media Systems y Adobe Systems llegan a un acuerdo en casos de patentes http://www.wowza.com/news/wowza-media-systems-and-adobe-systems-settle-patent-cases
  12. El proyecto Red5 (2009) Ping. Disponible en: http://trac.red5.org/wiki/Documentation/Tutorials/Ping . Consultado el 25 de diciembre de 2011.
  13. "Actualizaciones: 1 de noviembre de 2009" . Consultado el 1 de noviembre de 2009 .
  14. 1 2 "Compatibilidad con el códec HEVC VP9 AV1 en formato flv mejorado" . GitHub . 2 de febrero de 2024. Consultado el 1 de abril de 2024 .
  15. "Habilitar AV1, HEVC vía RTMP a YouTube" . GitHub . 25 de marzo de 2023. Consultado el 1 de abril de 2024 .
  16. "Desbloquea el poder de RTMP mejorado con Ant Media Server" . 26 de septiembre de 2024.
  17. "Presentación de la versión beta de transmisión mejorada" . GitHub . 8 de enero de 2024. Consultado el 1 de abril de 2024 .
  18. "xqq/mpegts.js" . 22 de octubre de 2025.