Главная страница
    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
4-1122138012
KSergey
2005-07-23 21:00
2005.09.11
Как запустить программу с правами system...


1-1124472520
Piter
2005-08-19 21:28
2005.09.11
Функция, вырезающая строку между двумя разделителями


1-1123735709
afanasic
2005-08-11 08:48
2005.09.11
Освобождение памяти при Destroy


1-1124560800
TerminalHead
2005-08-20 22:00
2005.09.11
Серис для WinXP


14-1123227421
Piter
2005-08-05 11:37
2005.09.11
Бакнелл - "Фундаментальные алгоритмы и структуры данных в Delphi"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский