Какие методы будут работать при потоковой передаче живого видео с использованием AForge.NET и Windows Forms?
Я пытаюсь отправить видео в реальном времени от клиента к другому клиенту и наоборот. Я использую сокеты TCP. Таким образом, AForge.NET помогает с получением видео с веб-камеры и отображением его в виде набора изображений в PictureBox. AForge.NET работает так же, как и ожидалось; проблема заключается только в быстрой передаче изображений другому клиенту. Я перепробовал много решений этой проблемы.
Один из них состоял в том, чтобы сначала посылать количество байтов как Int через сеть, а затем отправлять изображение (фрейм) клиенту. По какой-то причине, однако, после стольких кадров (каждый раз они меняются) он получит число, которое не является действительным представлением байтов, которые должны быть переданы. Я использую асинхронные обратные вызовы, поэтому, возможно, была некоторая задержка или, возможно, она была отправлена слишком быстро.
Затем другим решением, которое я попробовал, было установить полученное количество байтов на максимальное количество, которое можно отправить по TCP/IP, а затем просто заполнило пустые байты пробелами или каким-либо другим символом-заполнителем. Затем, чтобы проверить, насколько он велик, вы можете просто пройти (начиная с конца) байтовый массив и найти первый непробельный символ или символ, специально включенный для обозначения конца кадра в байтах. Это было бы более динамично в том смысле, что размер не нужен каждый раз, но эффективность снижается, хотя постоянный размер очень велик. И были проблемы с получением специального байта для работы. Поскольку это 64-битное приложение, один символ занимает 2 байта. Поэтому я добавил символ в рамку (в конце), чтобы обозначить место остановки рамки. Но он не мог обнаружить это, когда я побежал через это. Так что, возможно, я допустил ошибку, работая с байтами, но я чувствовал, что нужно было работать.
По сути, я хочу знать, используя AForge.NET, как получать видеоизображения, чтобы передавать потоковое видео из одного приложения в другое по сети, используя TCP-сокеты.
1 ответ
Ваш первый подход был правильным. То, что вы передаете между машинами, должно начинаться с количества переданных байтов, за которым следует фактическая полезная нагрузка. Вы должны попытаться исправить проблемы, которые у вас были в этом подходе.
Использование специальных значений, нулей или других, не будет работать с двоичными данными. Данные вашего изображения могут действительно содержать серию байтов, которые, как оказалось, будут вашим сторожевым значением, и ваш поток будет прерван.
При передаче данных через TCP-сокеты нужно следить за несколькими вещами. Важным является то, что вы получаете поток. Обработчик получения может получить меньше байтов, чем было отправлено с другой стороны на уровне приложения. Возможно, даже не достаточно байтов, чтобы перестроить переменную длины изображения. Это должно потреблять больше потока, чтобы наконец получить весь объект, который был отправлен.
В C# вы можете использовать TcpClient, получить его поток и вызвать для него Read(), он будет блокироваться до тех пор, пока из канала не будет использовано достаточное количество байтов.
На отправляющей стороне дважды проверьте формат пикселей (8bpp, 24bpp, 32bpp?) И возможное заполнение строк.
Также обратите внимание, что AForge утилизирует растровое изображение, когда ваш обработчик событий вернется. Особенно вы не должны передавать ссылку на растровое изображение в другой поток и отправлять его оттуда, сделайте свою собственную копию.