Форум: "Основная";
Текущий архив: 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