Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Помогите с разбором 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-1124274398
Helen
2005-08-17 14:26
2005.09.11
Работа с TThread


4-1122015926
Gear
2005-07-22 11:05
2005.09.11
Имя запускаемого файла.


1-1124305184
Tihinen
2005-08-17 22:59
2005.09.11
Виртуалка vs Корявый алгоритм


1-1124644597
WST
2005-08-21 21:16
2005.09.11
Залипание Splitrer ов при изменении размера


1-1124525245
slaga
2005-08-20 12:07
2005.09.11
Переопределение функций