我正试着定期从我们办公室周围的各种安全摄像头捕捉静态图像。我使用以下代码执行此操作:

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。得到永远不会结束,因为流基本上是无限的。我如何做一个http get,只得到第一个mb左右,然后我可以提取第一个图像?

最佳答案

回答你的具体问题:
我怎么能做一个http get,只得到第一个mb左右
如果web服务器支持Range请求头,则可以使用TIdHTTP.Request.Range属性指定要检索的所需字节范围,例如:

FHTTP.Request.Range := 'bytes; 0-1048575';
FHTTP.Get(FCamera.BuildURL(I), MS);

对字节范围的支持通过存在Accept-Ranges: bytes响应头(请参见TIdHTTP.Response.AcceptRanges属性)来表示,例如对同一资源的HEAD请求,该请求将在随后的GET请求中检索。
但是,如果Web服务器不支持字节范围,并且如果Web服务器使用MIME格式化的server push发送图像,例如使用multipart/x-mixed-replace内容类型,那么可以在hoNoReadMultipartMIME属性中启用TIdHTTP.HTTPOptions标志,以告知TIdHTTP.Get()在到达流数据的开始时退出。然后您可以直接从TIdHTTP.IOHanlder中手动读取并根据需要处理流数据。英迪的网站上有一篇关于这个话题的博文:
New TIdHTTP hoNoReadMultipartMIME flag

关于delphi - 使用Delphi 2007和Indy TIdHTTP v10从流中获取x字节的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29609746/

10-12 04:08