Мы внедрили приложение для совместной работы с аудио и видео поверх Silverlight и пытаемся настроить его.Одной из проблем, с которыми мы сталкиваемся, является увеличение задержки потока при каждом отбрасывании пакета: нам нужно дождаться, чтобы потеря пакета была обнаружена, запрошена, а затем, чтобы потерянный пакет был повторно отправлен.Конечно, это играет чертовски с последовательностью нашего аудио потока.(Мы бы переключились на UDP, если могли, но Silverlight не поддерживает это в браузере. Мы также отключили алгоритм Nagle, в общем, как только мы передадим массив byte [] для передачи,он передается и в одном пакете. Я знаю, что размер пакета TCP! = количество отправленных данных, но с отключенным алгоритмом Nagle, он близок. И у нас есть адаптивный буфер дрожания, поэтому мы можем иметь дело с потерянными пакетами, но потерянный пакет через TCP / IP значительно увеличивает количество аудио, которое нам нужно буферизовать, и, следовательно, задержку.)
Поэтому мы пытаемся оптимизировать способ отправки наших пакетов, чтобыпосмотрим, есть ли способ уменьшить влияние отброшенных пакетов.В настоящее время у нас есть несколько конкурирующих решений, о которых мы думаем реализовать:
(1) Мы могли бы попытаться увеличить наши пакеты.В настоящее время мы посылаем смесь больших (~ 1024 байт видео) пакетов и маленьких (~ 70 байт аудио) пакетов по одному и тому же потоку TCP.Но мы могли бы объединить аудио и видео данные вместе, то есть, присоединяя некоторые наши видео данные к нашим аудио пакетам, когда есть место.Это сделало бы отдельные пакеты несколько большими, но сократило бы общее количество пакетов.
(2) Мы могли бы разделить аудио и видео на два отдельных потока TCP.Это означает, что если видеопоток остановился из-за потерянного пакета, аудиопоток не остановился бы, и наоборот.Конечно, это немного увеличило бы издержки и не уменьшило бы общее количество отправленных пакетов.
(3) Мы могли бы инвертировать мультиплексирование аудио в несколько отдельных потоков TCP, а затем снова собрать их надальняя сторона.Это эффективно позволило бы нам «подделать» единый стиль доставки пакетов UDP.Если бы у нас было 8 аудиопотоков, и один из них застопорился из-за потерянного пакета, другие потоки все равно могли бы доставлять свои данные вовремя, и все, что нам нужно было бы сделать, - это обработать 1/8 аудиопакетов.быть недоступным, пока не остановится поток.Конечно, это не идеально, но это может привести к лучшему восприятию, чем остановка всего потока и невозможность воспроизведения любых пакетов до повторной передачи потерянного пакета.
Есть мысли по поводу любой из этих возможностей?Любые другие предложения?Или нам просто нужно кодировать все три, а затем проверить их?