使用 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:

New TIdHTTP hoNoReadMultipartMIME flag