|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Обработка потока с ip камеры
Господа, подскажите, какой компонент использовать для получения MJPEG over HTTP и каким образом лучше этот поток обработать?
Для получения отдельного кадра я использовал TidHTTP (инди). Код:
memorystream:=TMemoryStream.Create; Jpeg:=TJpegImage.create; IdHTTP1.Get('http://192.168.1.99/snapshot.cgi',memorystream); jpeg.LoadFromStream(memorystream); Когда отправляешь запрос: http://192.168.1.99/videostream.cgi, в ответ приходит поток данных: --myboundary (разделитель) Content-Type: image/jpeg Content-Length: (размер кадра) <JPEG image data> --myboundary Content-Type: image/jpeg Content-Length: <JPEG image data> и т.д... Мне нужно вытаскивать из этого потока кадры. Если использовать TidHTTP то руки связанны, так как memorystream используется методом GET(). Удобнее всего, было бы, как в TtcpClient - на событие onReceive обрабатывать каждый пришедший кусок данных и писать их в массив кадров... |
#2
|
||||
|
||||
использовать асинхронный (неблокируемый) TClientSocket и вручную мультиплексировать multipart данные.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
А можно по-подробнее? TClientSocket в Delphi 7 имеется или нужно докачать? Иии, каким образом с помощью него сформировать GET запрос к камере? Тип страницы - multipart/x-mixed-replace. Не сочтите за попрошайничество, но хотелось бы небольшой пример... Спасибо.
|
#4
|
||||
|
||||
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
|||
|
|||
Спасибо за помощь, теперь я знаю как искать в гугле! )))
Вот, для интересующихся набросал быдлокод пример. Это только для ознакомления с механизмом. Здесь конечно стоит работать в отдельном потоке и читать данные не в строку->мемстрим. Код:
procedure TForm1.Button1Click(Sender: TObject); //Кнопка подключения. begin ClientSocket1.Host:=Edit1.Text; //Записываем имя хоста (адресс камеры) ClientSocket1.Open; //Коннектимся mem:=tmemorystream.Create; //создаём поток jpeg:=tjpegimage.create; //создаём кадр f:=false; // Дополнительный флаг end; procedure TForm1.Button2Click(Sender: TObject); //Кнопка для отправки запроса на камеру. begin ClientSocket1.Socket.SendText('GET /videostream.cgi HTTP/1.1'+#13+#10+ 'Authorization: Basic ' + encodestring('admin:admin')+#13+#10+#13+#10); {/videostream.cgi - запрос потока для камеры (для своей камеры поищите в инете) #13+#10 - перевод каретки и новая строка Authorization: Basic ' + encodestring('admin:admin') - авторизация здесь кодируется base64 пользователь:пароль в конце запроса пустая строка } end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); //событие приёма данных var s:string; begin Application.ProcessMessages; //Обработка сообщений программы (для исключения зависания) s:=socket.ReceiveText; //принятая порция данных start:=pos('яШяа',s); //Поиск начала кадра JPEG в строке (FFD8) if start>0 then begin if mem.Size>0 then Begin mem.Position := 0; jpeg.LoadFromStream(mem); mem.Clear; Image.Canvas.Lock; try Image.Picture.Bitmap.assign(JPEG); //Запихиваем кадр на image для отображения finally Image.Canvas.Unlock; end; end; delete(s,1,start-1); //режем разделители mem.Write(s[1],length(s)); //пишем кусок данных в поток f:=true; end else if f then mem.Write(s[1],length(s)); end; |