我有一个用 Delphi 11写的应用程序。我使用TIdHttp客户端从摄像机接收实时流。在OnWork事件中接收数据。
我的代码看起来像这样
procedure TStreamingThread.IdHttpLiveStreamWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
MemoryStream: TMemoryStream;
BytesToRead: NativeInt;
begin
MemoryStream := TMemoryStream.Create;
try
BytesToRead := IdHttpLiveStream.Response.ContentStream.Position - LastPosition;
//read from where we got up to last time to the end of the stream
IdHttpLiveStream.Response.ContentStream.Position := LastPosition;
MemoryStream.CopyFrom(IdHttpLiveStream.Response.ContentStream, BytesToRead);
//extract the jpg data from the stream and use it update the screen
//update LastPosition so that we are ready for the next time
LastPosition := LastPosition + BytesToRead;
finally
MemoryStream.Free;
end;
我使用提取的jpg数据来更新TPicture,它都工作。
我的问题是关于ContentStream。它的大小不会不断增加,最终导致内存不足错误吗?我应该重新设置它吗?如果是,怎么做?
1条答案
按热度按时间xwmevbvl1#
是的,
ContentStream
会继续被写入,所以如果你使用像TMemoryStream
这样的目标流,那么它会继续增长。你必须Clear()
它每次你从它消费。否则,您可以考虑使用TIdEventStream
代替其OnWrite
事件。话虽如此,
TIdHTTP
并不是真正为处理流媒体而设计的。但是,根据响应的实际格式,您可能有一些选项。例如,如果使用HTTP块发送媒体数据,则可以使用TIdHTTP.OnChunkReceived
事件。或者,如果媒体类型是'multipart/...'
,例如'multipart/x-mixed-replace'
(或者如果数据是分块的),则可以使用hoNoReadMultipartMIME
(或hoNoReadChunked
)选项标志来告诉TIdHTTP
根本不读取响应正文,从而允许您直接使用IOHandler
自己读取正文。