使用 Delphi 2007 和 Indy TIdHTTP v10 从流中获取 x 字节的数据
Using Delphi 2007 and Indy TIdHTTP v10 get x bytes of data from a stream
我正尝试定期从我们办公室周围的各种安全摄像头捕捉静止图像。我使用以下代码来执行此操作:
Var
MS: TMemoryStream;
I: Integer;
Begin
MS := TMemoryStream.Create;
Try
// Loop through however many channels the camera has (most have 1 but 180
// cams have 4).
For I := 1 To FCamera.Channels Do
Begin
MS.Clear;
Try
// Use basic authentication only if a user name and password has been
// specified for access to the camera.
FHTTP.Request.BasicAuthentication := False;
If (FCamera.UserName <> '') Or (FCamera.Password <> '') Then
Begin
FHTTP.Request.Username := FCamera.UserName;
FHTTP.Request.Password := FCamera.Password;
FHTTP.Request.BasicAuthentication := True;
End;
FHTTP.Request.UserAgent := USERAGENT;
// Get the image from the camera.
FHTTP.Get(FCamera.BuildURL(I), MS);
这适用于大多数相机,因为它们具有 URL,您可以访问这些 URL 以获取当前的静止图像。我有一些相机,但它们只会给你一个 MJPEG 流,因此 FHTTP.Get 永远不会结束,因为流基本上是无限的。我如何执行 HTTP GET 并仅获取第一个 MB 左右然后我可以从中提取第一张图像?
回答您的具体问题:
How could I do a HTTP GET and only get the first MB or so
IF web服务器支持Range
请求header,可以使用TIdHTTP.Request.Range
属性指定要检索的所需字节范围,例如:
FHTTP.Request.Range := 'bytes; 0-1048575';
FHTTP.Get(FCamera.BuildURL(I), MS);
字节范围的支持由 Accept-Ranges: bytes
响应 header 的存在指示(参见 TIdHTTP.Response.AcceptRanges
属性),例如 HEAD
请求将与后续 GET
请求一起检索的相同资源。
但是,如果 Web 服务器不支持字节范围,并且 IF Web 服务器正在使用 MIME-formatted server push to send the images, such as with the multipart/x-mixed-replace
内容类型,那么您可以启用TIdHTTP.HTTPOptions
中的hoNoReadMultipartMIME
标志属性告诉TIdHTTP.Get()
到达流数据的开头时退出,然后可以手动从[=中读取21=] 直接根据需要处理流数据。 Indy 的网站上有一篇关于该主题的博客 post:
我正尝试定期从我们办公室周围的各种安全摄像头捕捉静止图像。我使用以下代码来执行此操作:
Var
MS: TMemoryStream;
I: Integer;
Begin
MS := TMemoryStream.Create;
Try
// Loop through however many channels the camera has (most have 1 but 180
// cams have 4).
For I := 1 To FCamera.Channels Do
Begin
MS.Clear;
Try
// Use basic authentication only if a user name and password has been
// specified for access to the camera.
FHTTP.Request.BasicAuthentication := False;
If (FCamera.UserName <> '') Or (FCamera.Password <> '') Then
Begin
FHTTP.Request.Username := FCamera.UserName;
FHTTP.Request.Password := FCamera.Password;
FHTTP.Request.BasicAuthentication := True;
End;
FHTTP.Request.UserAgent := USERAGENT;
// Get the image from the camera.
FHTTP.Get(FCamera.BuildURL(I), MS);
这适用于大多数相机,因为它们具有 URL,您可以访问这些 URL 以获取当前的静止图像。我有一些相机,但它们只会给你一个 MJPEG 流,因此 FHTTP.Get 永远不会结束,因为流基本上是无限的。我如何执行 HTTP GET 并仅获取第一个 MB 左右然后我可以从中提取第一张图像?
回答您的具体问题:
How could I do a HTTP GET and only get the first MB or so
IF web服务器支持Range
请求header,可以使用TIdHTTP.Request.Range
属性指定要检索的所需字节范围,例如:
FHTTP.Request.Range := 'bytes; 0-1048575';
FHTTP.Get(FCamera.BuildURL(I), MS);
字节范围的支持由 Accept-Ranges: bytes
响应 header 的存在指示(参见 TIdHTTP.Response.AcceptRanges
属性),例如 HEAD
请求将与后续 GET
请求一起检索的相同资源。
但是,如果 Web 服务器不支持字节范围,并且 IF Web 服务器正在使用 MIME-formatted server push to send the images, such as with the multipart/x-mixed-replace
内容类型,那么您可以启用TIdHTTP.HTTPOptions
中的hoNoReadMultipartMIME
标志属性告诉TIdHTTP.Get()
到达流数据的开头时退出,然后可以手动从[=中读取21=] 直接根据需要处理流数据。 Indy 的网站上有一篇关于该主题的博客 post: