delphi 使用Indy TIdHttp读取实时摄像头流的正确方法

4zcjmb1e  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(146)

我有一个用 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。它的大小不会不断增加,最终导致内存不足错误吗?我应该重新设置它吗?如果是,怎么做?

xwmevbvl

xwmevbvl1#

是的,ContentStream会继续被写入,所以如果你使用像TMemoryStream这样的目标流,那么它会继续增长。你必须Clear()它每次你从它消费。否则,您可以考虑使用TIdEventStream代替其OnWrite事件。
话虽如此,TIdHTTP并不是真正为处理流媒体而设计的。但是,根据响应的实际格式,您可能有一些选项。例如,如果使用HTTP块发送媒体数据,则可以使用TIdHTTP.OnChunkReceived事件。或者,如果媒体类型是'multipart/...',例如'multipart/x-mixed-replace'(或者如果数据是分块的),则可以使用hoNoReadMultipartMIME(或hoNoReadChunked)选项标志来告诉TIdHTTP根本不读取响应正文,从而允许您直接使用IOHandler自己读取正文。

相关问题