2010-09-19 26 views
5

Tengo que enviar una secuencia de fotogramas de video a través de UDP lo más rápido y en tiempo real posible y mientras obtengo las funciones básicas, me encuentro con todo tipo de dificultades. Algunos de mis objetivos:¿Cómo envío datos en tiempo real a través de UDP?

  1. datos normalmente se envían a través de dial-up (de ahí UDP en lugar de TCP), pero también tiene que apoyar Fast Ethernet.

  2. Está bien para caer de vez en cuando los marcos (de ahí UDP en lugar de TCP).

  3. Necesita baja latencia. El marco que recibe el control remoto debe haber sido enviado recientemente (no más de unos pocos cuadros esperando en los buffers).

  4. tengo que ser capaz de detectar el ancho de banda efectivo de modo que pueda comprimir los marcos más o menos para mantener la velocidad de fotogramas para arriba.

he logrado poner en práctica la mayor parte de las piezas:

  1. rompo datos de la trama en uno o más datagramas de alrededor de 500 bytes y cada uno tiene un número de secuencia y otra información. El receptor vuelve a montar todo el cuadro y detecta si falta algún datagrama.

  2. Si el receptor detecta más de un cierto porcentaje de fotogramas perdidos (por ejemplo, 50% en los últimos 10 fotogramas), envío un mensaje TCP al remitente para que disminuya un 50%. Remitente que aumenta lentamente la velocidad en un 5% en cada fotograma siguiente.

  3. Usando System.Net.Sockets.UdpClient para enviar y recibir los datos.

  4. que tienen un canal de puerto TCP utilizado para los mensajes de control de nuevo al remitente.

Mi principal dificultad en este momento está detectando el ancho de banda efectivo y hacer frente a la latencia, sobre todo en dial-up (máx ~ 4000 bytes/seg). Por ejemplo, si trato de enviar 100.000 bytes/segundo usando TcpClient.Send() TODOS parecen llegar (sin datagramas caídos) pero con una gran latencia para cuando llega el último datagrama. Creo que la función TcpClient.Send() está bloqueando hasta que el búfer pueda enviar, lo que estropea mi algoritmo actual.

Puede alguien me punto a cualquier fuente de información para saber cómo:

  1. Detectar ancho de banda real a través de UDP.

  2. un mejor algoritmo para ajustar dinámicamente el ancho de banda para satisfacer la tubería disponible.

  3. Enviar datos sin problemas en el ancho de banda deseado.

  4. Una forma de detectar y mantener la latencia al mínimo.

He estado haciendo girar mis ruedas durante la última semana y cada vez que resuelvo un problema, parece que otro problema es la cabeza.

Respuesta

2

También puede agregar una marca de tiempo a cada paquete.Entonces puedes detectar si el retraso aumenta. En este caso, envía un mensaje para reducir el ancho de banda.

Al crear la conexión, detecta la latencia con muy pocos paquetes. Este valor no debería cambiar durante la ejecución.

+0

Estoy seguro de que la detección de la latencia requerirá algún tipo de sincronización del datagrama. Por ejemplo, probablemente necesite adjuntar una marca de tiempo, enviarla al receptor, luego el receptor la devolverá (tal vez usando el canal de control TCP). Encuentra el tiempo de envío original en algún tipo de cola de historial y la diferencia/2 es el aprox. estado latente. No puedo encontrar algoritmos publicados para hacer esto para poder implementar de manera eficiente. –

+0

Ni siquiera necesita saber la latencia absoluta. Como se trata de resolver el ancho de banda, puedes mirar la sincronización entre fotogramas: si los fotogramas se enviaron a 40ms de distancia, pero estás viendo que están separados 90ms, entonces el emisor necesita disminuir la velocidad. – caf

+0

El problema con esto es que, con el tiempo, los pequeños retrasos pueden sumar un gran retraso entre el envío de un marco. Terminé enviando un ACK por cada cuadro completo recibido. En el remitente hago un seguimiento de los últimos 10 fotogramas enviados, cuándo fueron enviados y cuándo fueron confirmados. Si el tiempo promedio es demasiado grande, entonces sé reducir la velocidad. –

Cuestiones relacionadas