lunes, 5 de mayo de 2008

Televisión y vídeo en Internet (con redes P2P)

¿Quién podía imaginar hace 30 años que la televisión se podría transmitir por Internet?. Bueno... difícil... porque pocos sabían lo que era Internet, pero incluso las transmisiones digitales de TV eran casi imposibles de pensar. Hoy en día es posible "ver" canales de TV por Internet. Existen varias cadenas que incluso ponen vídeos sueltos en sus páginas para que los usuarios los puedan ver.

Recordemos lo que nos dice IP: "yo presto un servicio best-effort... haré lo posible por llevar tus datos desde A hasta B, pero no te aseguro nada". En concreto, no asegura que los datos, si llegan, lleguen en un cierto tiempo (quiero que lleguen en 5 segundos como máximo). Y esto es un gran problema en la TV o streaming de video como se llama de forma más pomposa.

Otro gran problema de IP es que, aunque existen los mecanismos, multicast no funciona en la realidad ya que los ISPs (Proveedores de Acceso a Internet) filtran ese tráfico. Recordemos que multicast es buenísmo para TV: el que envía el vídeo sólo debe generar una copia, independientemente del número de clientes que quieran recibir ese vídeo. Hoy en día, si 10 clientes quieren ver un canal, el que envía el vídeo debe enviar 10 copias del mismo vídeo (con lo que eso conlleva con respecto al "ancho de banda" necesario en el lado del servidor de vídeo).

Este último problema se puede resolver con técnicas de Peer-to-Peer (P2P) realizando ese multicast (no exactamente lo mismo) en la propia aplicación. En este caso, existen varias técnicas para crear lo que se conoce como ALM (Application-Level Multicast):
  • Push-tree: en este caso se creará un árbol multicast a nivel de aplicación. Es decir, tendremos un equipo que será la raíz del árbol y diferentes nodos en el siguiente nivel. De ese nivel bajaremos a equipos que estarán a otro nivel, hasta llegar a las "hojas" de dicho árbol, donde se terminará la transmisión. Se dice que es "push" porque un nodo en el árbol sabe a qué otros nodos debe enviar copias de lo que ha recibido (a sus hijos).
  • Pull-mesh: este es el método más utilizado por las aplicaciones actuales (SopCast, PeerCast, Ants, etc.) para transmitir vídeo en tiempo real con P2P. En este caso no tenemos un árbol sino una topología desestructurada (tampoco es una red mallada totalmente). La idea es que cada nodo tendrá "conocimiento" de otros nodos a los que les irá pidiendo (pull) datos. Otros nodos harán lo mismo con este primero.

Aunque pull-mesh sea el más utilizado, lo que nos gusta a nosotros los "investigadores" es bailar con la más fea. ¿Cómo mejorar el rendimiento del push-tree?. Bueno, existen un montón de artículos explicando cómo construir un árbol de la forma más eficiente, pero como ya hay un montón de gente haciendo esto, vamos a por algo más complicado.

Imaginemos que en el árbol que vemos en la figura de arriba, el nodo 0 decide irse a dormir. Ya digo que existen un montón de algoritmos para re-hacer el árbol, pero aún así, esto llevará su tiempo, con lo cual tendremos a un montón de nodos con sus pantallas en negro durante un cierto período.

Existe un método de codificación de vídeo bastante en moda en la parte de investigación que se llama MDC (Multi-Description Coding). La idea es bastante sencilla: divido un vídeo en varias partes (no a lo largo del tiempo, sino en el mismo instante). Un ejemplo fácil (recordemos que un vídeo no es más que una secuencia de imágenes): cojo una imagen y la divido en dos partes -los píxeles impares por un lado y los pares por otro-. Fijémosnos en que las dos partes tienen menos calidad que la original, pero si tenemos ambas y las unimos, tendremos la calidad original. Pues ahora imaginemos que tenemos dos ficheros: video-par.mp4 y video-impar.mp4. Si enviamos ambos streams, utilizando caminos diferentes, un receptor podría ver el vídeo a una calidad "baja" si recibe uno de los dos streams, pero a una calidad total si recibe los dos. En este caso, la probabilidad de tener la pantalla en negro es la prob. de que ninguno de los dos streams llegue.

Pues juntando las ideas de Push-tree y MDC sale la idea de múltiples árboles. Cada nodo formará parte de tantos árboles como partes tenga el vídeo (en el ejemplo anterior, dos árboles). Imaginemos que el árbol de la figura anterior es el que distribuye el video-par.mp4. En ese caso vemos que el nodo 7 es hijo del 4. En el otro árbol, el que distribuye el video-impar.mp4, podríamos tener una distribución diferente, y por ejemplo el nodo 7 ser hijo del 1 directamente.

Hay un montón de cosas que tenemos que tener en cuenta. Por ejemplo, los nodos "hoja" son los más felices del mundo: reciben tráfico sin tener que enviárselo a nadie. Bueno, pues podemos hacer un algoritmo en el que si un nodo es hoja en un árbol, tenga que ser un nodo "padre" en otro árbol (ver Splitstream).

No hay comentarios: