Главная страница
    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.012 c
3-1122991719
vol
2005-08-02 18:08
2005.09.11
можно абдейт нескольких в одну строку?


14-1124159977
Думкин
2005-08-16 06:39
2005.09.11
16 августа. С Днем!


4-1121870239
Profik
2005-07-20 18:37
2005.09.11
Прога в трее


5-1098135317
Михель
2004-10-19 01:35
2005.09.11
Подскажите, как правильно переопределить свойство компонента!


4-1121925450
Kair+
2005-07-21 09:57
2005.09.11





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