2013-08-03 2 views
0

Итак, моя цель - сделать основное приложение для потокового видео с голыми костями.Image.FromStream get застрял

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

Итак, теперь проблема в этой строке

Image img = Image.FromStream(receiveStream); 

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

ответ

3

Я подозреваю, что проблема заключается в том, что NetworkStream не закрывается, поэтому Image.FromStream не знает, когда закончится текущее изображение.

Предполагая, что вы отвечаете за протокол, вы можете префикс длины каждого изображения, а затем, когда вы используете , читаете из потока, вы можете прочитать точное количество байтов в массив байтов, a MemoryStream, а затем передать это Image.FromStream. Таким образом, каждый вызов Image.FromStream получает поток, который заканчивается после одного изображения.

Так что ваш NetworkStream будет выглядеть следующим образом:

Length (4 bytes) 
Data for one image 
Length (4 bytes) 
Data for one image 
// etc 
+0

О, я не знал, что 'Image.FromStream' требует, чтобы' NetworkStream' закрывался для каждой картинки. Я отправляю приблизительно 20 изображений в секунду через поток, и я просто предположил, что 'Image.FromStream' автоматически найдет каждое изображение из потока. Теперь я попытаюсь обойти это. –

+0

@WinCoder: Это всего лишь подозрение, но это будет иметь определенный смысл. –

3

Вы не удосужился проблемы реального еще. Для метода Image.FromStream() требуется поток, чье свойство CanSeek является истинным. Для этого требуется декодер изображения. Однако это не относится к NetworkStream, оно не может поддерживать поиск.

Вы должны сначала сохранить изображение в MemoryStream. Как только это будет заполнено, установите для позиции значение 0 и вызовите Image.FromStream(). Удостоверьтесь, что не распоряжаться или повторно использовать MemoryStream, что очень затрудняет диагностику GenericException позже. Декодер изображения ленив и должен иметь возможность доступа к потоку при визуализации изображения.

Чтобы сделать эту работу, вы должны знать, сколько данных нужно читать из NetworkStream. Другими словами, вам нужно знать, сколько байтов присутствует в кадре. Вы можете сделать это, сначала передав передатчик int, а затем байты на изображении. На конце чтения вы можете сначала прочитать 4 байта из потока и использовать BitConverter.ToInt32() для восстановления длины. И можно просто подсчитать байты в потоке, чтобы узнать, когда MemoryStream готов, и можно вызвать Image.FromStream().

После того, как вы приобретете это на месте, вы либо решите, какая ошибка будет зависеть от вашего текущего кода, либо будет очень хорошим способом его отладки.

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

  • Нет связанных вопросов^_^