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