Форум » IP Kamera 9060AK/A-SL/A-MP/A Plus/I (IR)/O » Получение видео потока c 9060A-SL VB .NET » Ответить

Получение видео потока c 9060A-SL VB .NET

Dasg: Здравствуйте! Хочу получить видео с камеры из-под visual basic .net. Получаю 2-3 картинки после чего генерируется исключение ArgumentException "Недопустимый параметр". Такое же исключение генерируется, если резко изменить сцену перед камерой, например, помахать рукой. В коде я указал в каком месте оно возникает. В чем может быть проблема? [pre] Imports System.Net Imports System.Net.Sockets Imports System.Text Imports System.Drawing Imports System.IO 'Класс для использования IP камеры Public Class CameraIP Private Const bytesToRead As Integer = 128 Private Const buferLength As Integer = 130720 '1кБ Private Const startByte As Byte = &HFF Private Const secondByte As Byte = &HD8 Private Const lastByte As Byte = &HD9 Private camSocket As Socket 'Буфер для считывания изображения Private buffer(buferLength) As Byte 'Количество байт изображения считанных в буфер Private bufferPos As Integer 'True если уже началось считывание очередного изображения Private startImage As Boolean Public Sub New(ByVal IP As String, ByVal port As Integer, ByVal login As String, ByVal password As String) bufferPos = 0 startImage = False camSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP) camSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5) Try camSocket.Connect(IP, port) 'Посылаем http запрос на чтение видео Dim message As String = "GET " & "/cgi-bin/Stream?Video?UserName=" & login & "&PassWord=" & password & " HTTP/1.0" Dim ascii As New ASCIIEncoding() Dim request As Byte() = ascii.GetBytes(message) camSocket.Send(request, request.Length, SocketFlags.None) buffer(0) = 13 buffer(1) = 10 camSocket.Send(buffer, 2, SocketFlags.None) message = "User-Agent: BECKHOFF-Automation VERSION" camSocket.Send(buffer, 2, SocketFlags.None) message = "Connection: close" camSocket.Send(buffer, 2, SocketFlags.None) Catch e As SocketException camSocket = Nothing Debug.WriteLine(e.Message) Debug.Assert(Connected) End Try End Sub Public Function GetImage(ByRef image As Image) As Boolean Dim res, i, temp As Integer Dim endImage As Boolean = False 'встречен конец изображения Do 'Читаем из входного потока по bytesToRead байт res = camSocket.Receive(buffer, bufferPos, bytesToRead, SocketFlags.None) temp = bufferPos + res - 1 i = bufferPos 'Если уже началось считывание изображения If startImage Then Do Until i > temp Or endImage 'JPG картинка в MJPEG потоке заканчивается 2 байтами 0xFFD9 If buffer(i) = startByte And buffer(i + 1) = lastByte Then endImage = True Else i += 1 End If Loop Else 'Читаем поток пока не встретим начальные байты Do Until i > temp Or startImage 'JPG картинка в MJPEG потоке начинается 2 байтами 0xFFD8 If buffer(i) = startByte And buffer(i + 1) = secondByte Then startImage = True Else i += 1 End If Loop 'Если встретилось начало картинки, перемещаем уже считанные байты в начало буфера If startImage Then res -= i - bufferPos For temp = 0 To res buffer(temp) = buffer(temp + i) Next temp End If End If bufferPos += res Loop Until endImage And res >= 0 If endImage Then i += 2 'Исключение генерируется после вызова следующей функции image = Bitmap.FromStream(New MemoryStream(buffer, 0, i)) temp = i startImage = False 'Проверим нет ли начала изображения в оставшихся считанных байтах Do Until temp > bufferPos Or startImage If buffer(temp) = startByte And buffer(temp + 1) = secondByte Then startImage = True Else temp += 1 End If Loop temp = bufferPos - i bufferPos -= res 'Если началось считывание очередного изображения, поместим его в начало буфера For i = 0 To temp buffer(i) = buffer(i + bufferPos) Next i bufferPos = temp End If Return res > 0 End Function ReadOnly Property Connected() As Boolean Get If camSocket Is Nothing Then Connected = False Else Connected = camSocket.Connected End If End Get End Property End Class [/pre]

Ответов - 3

Guest: Попробуйте взять любой мастер закачек (встроенный в Opera например), сохранить и проанализировать поток за определенное время. Скорее всего где-то ошибка в коде т.к. программ и написанных непосредственно для этой модели и универсальных наберется с два десятка и ничего похожего не наблюдается. Посмотрите данную ветку, там есть ссылки на примеры.

Dasg: и ещё вопрос: мне во время выполнения нужно менять разрешение с 640*480 на 160*120. Как это сделать? Какой запрос нужно послать?

Guest: Закрыть текущую сессию. http://Camera_IP:Port/cgi-bin/StreamVideoClose?UserName=User=&PassWord=Pass Открыть новую с заданным разрешением и качеством. http://Camera_IP:Port/cgi-bin/Stream?Video?res=Size?qual=Qt?UserName=User=&PassWord=Pass либо http://User:Pass@Camera_IP:Port/cgi-bin/Stream?Video?res=Size?qual=Qt Camera_IP, Port, User и Pass меняем соответственно на IP адрес камеры, порт, логин и пароль администратора. Size=0 - 640x480, 1 - 320x240, 2 - 160x112; Qt=50 - Basic, 70 - Normal, 85 - Fine. Подробнее в SDK и здесь. PS: Еще один пример работы с потоком тут.




полная версия страницы