Как реализовать ограничение трафика TCP на стороне отправителя? - PullRequest
0 голосов
/ 22 декабря 2010

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

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

Спасибо заранее, Mayday

Редактировать: Разъяснения вопросов (sry!)

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

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Вам необходим буфер / очередь минимум из 3 кадров:

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

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

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

0 голосов
/ 22 декабря 2010

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

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

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

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

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

  1. Как часто снимать изображение и отправлять его
  2. Как сложно сжать это изображение
...