2014-11-21 4 views
1

Я пытаюсь отправить живой видео-канал от клиента другому клиенту и наоборот. Я использую TCP-сокеты. Таким образом, AForge.NET помогает получать видео с веб-камеры и отображать его как набор изображений в PictureBox. AForge.NET работает так, как ожидалось; это просто быстрое получение изображений другому клиенту, что является проблемой. Я пробовал много решений этой проблемы.Какие методы будут работать в потоковом видео в реальном времени с использованием AForge.NET и Windows Forms?

Одна из них заключалась в том, чтобы сначала отправить количество байтов в виде Int по сети, а затем отправить изображение (кадр) клиенту. По какой-то причине, хотя после стольких кадров (каждый раз они менялись), он получал число, которое не является допустимым представлением байтов, которые должны быть отправлены. Я использую асинхронные обратные вызовы, поэтому, возможно, была какая-то задержка или, возможно, она была отправлена ​​слишком быстро.

Тогда еще одно решение, которое я попытался, устанавливало байты, полученные на максимальную сумму, которая может быть отправлена ​​через TCP/IP, а затем просто заполняла пустые байты пробелами или другим символом наполнителя. Затем, чтобы проверить, насколько велика это, вы можете просто запустить (начиная с конца) массив байтов и найти первый непространственный символ или символ, особенно включенный, чтобы обозначить конец кадра в байтах. Это было бы более динамичным, так как размер не нужен каждый раз, но эффективность снижается, хотя из-за того, что постоянный размер настолько велик. И были проблемы с получением специального байта для работы. Так как это 64-битное приложение, один символ - 2 байта. Поэтому я добавил символ в рамку (в конце), чтобы обозначить, где кадр останавливается. Но он не смог ее обнаружить, когда я побежал назад. Так что, может быть, я ошибся, работая с байтами, но я чувствовал, что нужно работать.

В принципе, я хочу знать, используя AForge.NET, как получить видеоизображения, транслировать видео в реальном времени из одного приложения в другое по сети с использованием сокетов TCP.

ответ

0

Ваш первый подход был правильным. То, что вы передаете между машинами, должно начинаться с количества переданных байтов, за которым следует фактическая полезная нагрузка. Вы должны попытаться исправить проблемы, которые были у вас в этом подходе.

Использование специальных значений, нулей или других объектов, не будет работать с двоичными данными. Ваши данные изображения могут содержать целую серию байтов, которые как раз и являются вашим дозорным значением, и ваш поток будет сломан.

При передаче данных по TCP-сокетам можно наблюдать множество вещей. Важно то, что вы получаете поток. Обработчик приема может получить меньше байтов, чем тот, который был отправлен с другой стороны на уровне приложения. Возможно, даже недостаточно байтов для перестройки переменной длины изображения. Он должен потреблять больше потока, чтобы, наконец, получить весь объект, который был отправлен.

В C# вы можете использовать TcpClient, получить его поток и вызвать Read() на нем, он будет блокироваться до тех пор, пока из этого канала не будет потреблено достаточное количество байтов.

На стороне отправки дважды проверьте формат пикселей (8bpp, 24bpp, 32bpp?) И возможное заполнение строки.

Также обратите внимание, что AForge будет использовать битмап, когда ваш обработчик событий вернется. Особенно вы не должны передавать ссылку Bitmap другому потоку и отправлять его оттуда, создать свою собственную копию.