Я должен посылать последовательность видеокадров по UDP как можно быстрее и в режиме реального времени, и пока я работаю с основами, я сталкиваюсь со всевозможными трудностями.Некоторые из моих целей:
Данные обычно отправляются по коммутируемому соединению (следовательно, UDP вместо TCP), но также должны поддерживать быстрый Ethernet.
Время от времени можно отбрасывать кадры (следовательно, UDP вместо TCP).
Требуется низкая задержка.Кадр, получаемый удаленным, должен быть тем, который был недавно отправлен (не более нескольких кадров, ожидающих в буферах).
Мне нужно иметь возможность определять эффективную полосу пропускания, чтобы я могсжимать кадры более или менее, чтобы поддерживать частоту кадров.
Мне удалось реализовать большинство частей:
Я разбиваю кадрданные в одну или несколько дейтаграмм размером около 500 байтов, каждый из которых имеет порядковый номер и другую информацию.Приемник собирает весь кадр и определяет, отсутствуют ли какие-либо дейтаграммы.
Если получатель обнаруживает более определенного процента пропущенных кадров (например, 50% за последние 10 кадров), я отправляю отправителю сообщение TCP для замедления на 50%.Отправитель медленно увеличивает скорость на 5% каждый последующий кадр.
Использование System.Net.Sockets.UdpClient для отправки и получения данных.
У меня есть отдельный канал TCP, используемый для управляющих сообщений обратно отправителю.
Моя основная проблема сейчас заключается в определении эффективной полосы пропускания и борьбе с задержкой, особенно по коммутируемому соединению (макс. ~4000 байт / с).Например, если я пытаюсь отправить 100 000 байтов в секунду, используя TcpClient.Send (), они ВСЕ, кажется, прибывают (без пропущенных дейтаграмм), но с большой задержкой ко времени прибытия последней дейтаграммы.Я думаю, что функция TcpClient.Send () блокируется, пока буфер не сможет отправить, что испортит мой текущий алгоритм.
Может кто-нибудь указать мне на любые источники информации о том, как:
Определение фактической пропускной способности по UDP.
Лучший алгоритм для динамической настройки пропускной способности в соответствии с доступным каналом.
Отправитьданные плавно с желаемой пропускной способностью.
Способ обнаружения и снижения задержки до минимума.
Я крутил свои колесана прошлой неделе, и каждый раз, когда я решаю одну проблему, кажется, что другая поднимает голову.