Главная страница
    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.01 c
14-1124362119
kyn66
2005-08-18 14:48
2005.09.11
Программа для защиты CD от копирования и виртуализации


2-1123330614
dezdemona
2005-08-06 16:16
2005.09.11
kak ispolzovat Canvas na procedure?


14-1124340419
CHES
2005-08-18 08:46
2005.09.11
Архив конференции "основная" за 2004 год


3-1122486388
Djek
2005-07-27 21:46
2005.09.11
Добавление значений в список Items в ComboBox


4-1122112344
Vir
2005-07-23 13:52
2005.09.11
Hardware ID





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