2010-09-19 11 views
5

Muszę wysłać sekwencję klatek wideo przez UDP tak szybko i w czasie rzeczywistym, jak to tylko możliwe, a gdy mam już działające podstawy, napotykam na różnego rodzaju trudności. Niektóre z moich celów:Jak wysłać dane w czasie rzeczywistym przez UDP?

  1. Dane będą zazwyczaj przesyłane przez dial-up (stąd UDP zamiast TCP), ale również musi obsługiwać szybki Ethernet.

  2. Od czasu do czasu można odrzucić ramki (stąd UDP zamiast TCP).

  3. Potrzebujesz małego opóźnienia. Ramka, którą odbiera pilot, powinna być tą, która została ostatnio wysłana (nie więcej niż kilka ramek oczekujących w buforze).

  4. Potrzebuję być w stanie wykryć efektywną przepustowość, aby móc kompresować ramki w mniejszym lub większym stopniu, aby utrzymać szybkość klatek na sekundę.

udało mi się wdrożyć większość elementów:

  1. ja zerwać dane ramki do jednego lub większej liczby datagramów około 500 bajtów, a każda z nich ma numer porządkowy i inne informacje. Odbiornik składa całą ramkę i wykrywa brak datagramów.

  2. Jeśli odbiornik wykryje więcej niż określony procent zrzuconych ramek (na przykład 50% w ciągu ostatnich 10 ramek), wysyłam komunikat TCP do nadawcy, aby zwolnić o 50%. Nadawca niż powoli zwiększa prędkość o 5% w kolejnych klatkach.

  3. Używanie System.Net.Sockets.UdpClient do wysyłania i odbierania danych.

  4. Mam osobny kanał TCP używany do wysyłania wiadomości kontrolnych do nadawcy.

Moja główna trudność polega na wykrywaniu efektywnej przepustowości i radzeniu sobie z opóźnieniami, szczególnie w przypadku wybierania numeru (maks. 4 000 bajtów/s). Na przykład, jeśli próbuję wysłać 100 000 bajtów na sekundę przy użyciu TcpClient.Send(), wydaje się, że WSZYSTKIE wydają się nadchodzić (bez upuszczonych datagramów), ale z dużym opóźnieniem w momencie nadejścia ostatniego datagramu. Myślę, że funkcja TcpClient.Send() jest blokowana, dopóki bufor nie jest w stanie wysłać, co zakłóca mój obecny algorytm.

Czy ktoś może wskazać mi do wszelkich źródeł informacji na temat:

  1. Wykrywanie rzeczywistej przepustowości przez UDP.

  2. Lepszy algorytm dynamicznej regulacji przepustowości w celu dopasowania do dostępnej rury.

  3. Przesyłaj dane płynnie z żądaną przepustowością.

  4. Sposób na wykrycie i ograniczenie opóźnień do minimum.

Kręciłem się kółkami w ciągu ostatniego tygodnia i za każdym razem, gdy rozwiązuję jeden problem, wydaje się, że kolejnym wzrostem jest głowa.

Odpowiedz

2

Możesz także dodać sygnaturę czasową do każdego pakietu.Następnie możesz wykryć, czy opóźnienie rośnie. W takim przypadku odsyłasz wiadomość, aby zmniejszyć przepustowość.

Po utworzeniu połączenia można wykryć opóźnienie przy użyciu bardzo niewielu pakietów. Ta wartość nie powinna zmieniać się podczas działania.

+0

Jestem pewien, że wykrycie opóźnienia będzie wymagało pewnego rodzaju synchronizacji datagramów. Na przykład prawdopodobnie potrzebuję dołączyć znacznik czasu, wysłać do odbiornika, odbiornik następnie odsyła go (być może za pomocą kanału kontrolnego TCP). Znajdź oryginalny czas wysłania w jakiejś kolejce historii, a różnica/2 to aprox. czas oczekiwania. Nie mogę znaleźć opublikowanych algorytmów, aby to zrobić, więc mogłem wydajnie wdrażać. –

+0

Nie musisz nawet znać absolutnego opóźnienia. Ponieważ jego przepustowość jest próbą rozwiązania, możesz po prostu spojrzeć na czas między klatkami - jeśli ramki zostały wysłane w odległości 40 ms od siebie, ale widzisz je w odległości 90 ms od siebie, to nadawca musi zwolnić. – caf

+0

Problem polega na tym, że z czasem niewielkie opóźnienia mogą powodować duże opóźnienie między wysyłaniem ramki. Skończyło się na wysłaniu potwierdzenia ACK dla każdej otrzymanej pełnej ramki. U nadawcy śledzę ostatnie 10 wysłanych ramek, kiedy zostały wysłane i kiedy zostały potwierdzone. Jeśli średni czas jest zbyt duży, to wiem, że zwalniam. –

Powiązane problemy