Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

Помогите с разбором HTTP ответа сервера (IP-камеры).   Найти похожие ветки 

 
DVM ©   (2005-08-22 10:47) [0]

Ситуация такая. Есть IP-камера, вещающая в формате MotionJPEG (Обычные JPEG-и, разделенные разделителями). Требуется получать изображения с этой камеры. Желательно через обычный TClientSocket.

Камера выдает следующий ответ при обращении к ней:

HTTP/1.0 200 OK#13#10
Server: Camera Web Server/1.0#13#10
Auther: Steven Wu#13#10
MIME-version: 1.0#13#10
Cache-Control: no-cache#13#10
Content-Type:multipart/x-mixed-replace;boundary=--video boundary--#13#10#13#10
--video boundary--#13#10
Content-length: 6399#13#10
Content-type: image/jpeg#13#10#13#10

Далее идет картинка JPEG в чистом виде

Потом опять:
--video boundary--#13#10
Content-length: 6399#13#10
Content-type: image/jpeg#13#10#13#10

Далее след картинка и т.д.

Надо выцепить из этого потока картинки.

Сам поток получаю так примерно:
//--------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
 intReturnCode,i: Integer;
 s, LocalFileName: string;
 szBuffer: array [0..1023] of Char;
 FileOut: TFileStream;
 boundary: string;
begin
 LocalFileName := "c:\snapshot.dat";
 FileOut := TFileStream.Create(LocalFileName, fmCreate);
 try
 begin
   ClientSocket.Host := "192.168.50.137";
   ClientSocket.Socket.ClientType := ctBlocking;
   ClientSocket.Port := 80;
   try
     ClientSocket.Open;
     s:="GET /video.cgi HTTP/1.0"#13#10 +
        "Host: 192.168.0.20"#13#10 +
        "Accept: www/source, text/html, video/mpeg, image/jpeg, image/x-tiff"#13#10+
        "Accept: image/x-rgb, image/x-xbm, image/gif, */*, application/postscript"#13#10+
        "Content-type: application/x-www-form-urlencoded"#13#10#13#10;
     intReturnCode := ClientSocket.Socket.SendBuf(Pointer(s)^, Length(s));
     if intReturnCode > 0 then
     begin
       repeat
         FillChar(szBuffer, SizeOf(szBuffer), 0);
         intReturnCode := ClientSocket.Socket.ReceiveBuf(szBuffer, SizeOf(szBuffer));
         FileOut.Write(szBuffer, intReturnCode);
       until intReturnCode <= 0;
     end
     else
       MessageDlg("No answer from server", mtError, [mbOk], 0);
       ClientSocket.Close;
   except
     MessageDlg("No connection", mtError, [mbOk], 0);
   end;
 end;
 finally
   FileOut.Free
 end;
end;

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


 
Наиль ©   (2005-08-22 11:18) [1]

Если файл не большой (можно и большой, да память жалко).
Грузим файл в строку:
FileOut.position:=0;
SetLength(s,FileOut.Size);
FileOut.Write(s[1],FileOut.Size);
x:=0;


Начинаем
x:=PosEx(#13#10,s,x);
и сохраняем строки заголовка для анализа.

После Content-type...
x:=x+2 - переход к началу ккартинки
Записываем картинку в файл
f.Write(s[x],ContentLength);
Переходим к следующему блоку
x:=x+ContentLength;
И снова Начинаем.

Наверняка, я ошибся плюс-минус байт в формулах.
Но суть должна быть ясна.


 
DVM ©   (2005-08-22 12:10) [2]


>
> Наиль ©   (22.08.05 11:18) [1]

Если бы было все так просто.
Файл, что я сохраняю, не  имеет конца (поток льется и льется). Это в примере есть сохранение всего потока, а в результате я должен сохранять только картинки, поток надо только анализировать, не сохраняя.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
1-1124486594
BBoost
2005-08-20 01:23
2005.09.11
"перерисовать" экран


14-1124307013
lookin
2005-08-17 23:30
2005.09.11
ZoneAlarm не дает спокойно жить


14-1124343430
cherrex
2005-08-18 09:37
2005.09.11
Картинки для компонентов


14-1124216237
cyborg
2005-08-16 22:17
2005.09.11
Missing operation system


14-1124199196
Vlad Oshin
2005-08-16 17:33
2005.09.11
Как думаете, кто глючит: принтер или FastReport?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский