2010-12-22 12 views
0

Я собираюсь внедрить систему видеочата веб-камеры для нескольких пользователей на C++ (windows/linux). Поскольку обычный пользователь обычно подключается через DSL/кабель, существует ограничение пропускной способности для моих (предпочтительных) соединений TCP/IP.Как реализовать ограничение трафика TCP для стороны отправителя?

Основная идея - передать максимально возможную частоту кадров, учитывая ограничение полосы пропускания для стороны отправителя. (Другие приложения могут по-прежнему нуждаться в пропускной способности интернета в фоновом режиме.) На втором этапе скорость захвата камеры автоматически настраивается на сетевые ограничения, чтобы избежать чрезмерных расходов процессора.

У меня есть постоянный поток сжатых изображений (с сильно изменяющимися размерами буфера), которые необходимо передать на удаленную сторону. Учитывая ограничение, скажем, 20kb/s, как лучше всего реализовать это ограничение? (Обратите внимание, что пользователь должен определить этот предел!)

Thx заранее, Mayday

Edit: Вопрос clearifications (! СРЮ)

  • Речь идет о том, как трафик-формы произвольный TCP/IP.
  • Это не Как реализовать скорость изображения/снижение качества, как предлагает мой прецедент. (Altough я не считал для автоматической настройки сжатия изображения, но (Thx Jon).)

ответ

0

Есть две вещи, которые вы можете сделать, чтобы уменьшить пропускную способность:

  1. Отправить меньшие изображения (более сжатия)
  2. Отправить меньше изображений

При реализации алгоритма, который выбирает размер и количество изображений в честь выбранного пользователя предела, вы должны балансировать между простым/робастным алгоритмом и производительным алгоритмом (на е, что делает максимальную пользу за пределом).

Первый подход, который я хотел бы попробовать, - использовать скользящее среднее используемой полосы пропускания в любой момент времени для «семени» вашего алгоритма. Время от времени проверяйте среднее. Если он становится больше вашего предела, попросите алгоритм использовать меньше (пропорционально тому, насколько вы превысили лимит). Если он станет значительно ниже вашего предела, скажем, менее 90%, попросите алгоритм использовать больше.

Чем меньше/больше, инструкция может быть переменной (может быть int или float, на самом деле есть много возможностей для изобретательности здесь), используемых вашего алгоритм, чтобы решить:

  1. Как часто, чтобы захватить изображение и отправить его
  2. Как трудно сжать этот образ
+0

Идея состоит в том, чтобы автоматически регулировать количество изображений (с заданной степенью сжатия) с учетом скорости сетевого сокета. Это означает, что соединение не должно влиять на размеры изображений/коэффициенты сжатия и т. Д. – Mayday

+0

Хорошо, вы правы: алгоритм настройки может влиять как на скорость изображения, так и на качество .... Я, возможно, должен уяснить свой вопрос: я надеялся, что писатель сокета TCP может уменьшить трафик сам по себе (то есть путем остановки очереди отправки), чтобы достичь ограничений трафика. Таким образом, он останется прозрачным для данных, которые он передает ... – Mayday

+0

@ Майей: ну, просто забудь, что я сказал что-нибудь о сжатии. Но если единственное, что вы можете изменить, это FPS изображений, вы не будете иметь хорошую детализацию. Особенно, если пределы полосы пропускания низкие! – Jon

0

Вам нужен буфер/очереди, по крайней мере, 3 кадра:

  • Один кадр, который в настоящее время отправляется в сеть;
  • Один полный кадр, который будет отправлен дальше;
  • Один кадр в настоящее время копируется с камеры.

Когда отправитель сети заканчивает отправку кадра, он копирует кадр «быть отправленным дальше» в слот «в настоящее время». Когда считыватель камеры завершает копирование кадра с камеры, он заменяет рамку «для отправки следующего» с скопированным фреймом. (Очевидно, что синхронизация требуется вокруг кадра «для отправки следующего»).

Отправитель могут затем модулировать скорость отправки, как он считает нужным. Если он работает медленнее, чем камера, он просто отбрасывает кадры.

+0

Звучит очень хорошо! Но .. как я могу модулировать скорость отправки TCP-соединения? – Mayday

+0

@Mayday: контролируя, как часто вы вызываете 'send()'. Например, если вы только что отправили кадр размером 75 КБ и хотите ограничить скорость отправки до 20 кБ/с, вам нужно спать за 75/20 = 3,75 секунды перед отправкой следующего кадра. – caf

Смежные вопросы