You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Indy TIdHttp读取摄像头直播流的正确方式及内存问题咨询

关于Delphi 11中TIdHTTP接收直播流时ContentStream内存占用的问题

你担心的问题确实存在:如果不处理Response.ContentStream,它会持续累积接收的数据,长时间运行后必然导致内存耗尽,必须对其进行重置清理。

问题根源

你的代码每次仅读取ContentStream中从上一次处理位置到当前位置的增量数据,但已处理过的数据仍会保留在流中,随着直播持续,流的体积会不断增大,占用的内存也会越来越多。

重置方案及代码修改

最直接的解决方式是:在处理完当前批次的新数据后,清空ContentStream并同步重置记录位置的LastPosition变量,让后续接收的新数据从头开始写入流中。

修改后的完整代码如下:

procedure TStreamingThread.IdHttpLiveStreamWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
  MemoryStream: TMemoryStream;
  BytesToRead: NativeInt;
begin
  // 仅处理读取数据的场景,忽略写入触发的OnWork事件
  if AWorkMode <> wmRead then Exit;

  MemoryStream := TMemoryStream.Create;
  try
    BytesToRead := IdHttpLiveStream.Response.ContentStream.Position - LastPosition;
    // 无新数据时直接退出,避免无效操作
    if BytesToRead <= 0 then Exit;

    // 定位到上次处理的位置,读取新数据
    IdHttpLiveStream.Response.ContentStream.Position := LastPosition;
    MemoryStream.CopyFrom(IdHttpLiveStream.Response.ContentStream, BytesToRead);

    // --- 这里保留你提取JPG并更新界面的代码 ---
    // extract the jpg data from the stream and use it update the screen
    // 注意:更新UI的操作需要同步到主线程,可使用Synchronize或Queue方法

    // 更新最后处理的位置
    LastPosition := LastPosition + BytesToRead;

    // 当已处理完流中所有数据时,清空流并重置位置变量
    if LastPosition >= IdHttpLiveStream.Response.ContentStream.Size then
    begin
      IdHttpLiveStream.Response.ContentStream.Clear;
      LastPosition := 0;
    end;
  finally   
    MemoryStream.Free;
  end;
end;

关键细节说明

  • 过滤工作模式:判断AWorkMode = wmRead,只处理接收数据的场景,避免响应写入操作触发的事件。
  • 空数据判断:增加BytesToRead <= 0的判断,防止无新数据时执行无效操作。
  • 同步位置变量:清空ContentStream后必须将LastPosition重置为0,否则下次计算增量数据时会出现错误。
  • UI线程同步:如果你的界面更新代码直接在这个线程中执行,记得用Synchronize或Queue将操作同步到主线程,避免跨线程访问VCL控件的问题。

其他可选方案

如果你的场景对内存占用要求极高,也可以将ContentStream替换为TFileStream,把临时数据写入本地文件而非内存,处理完后删除已处理的文件片段。不过这种方式会增加IO开销,适合内存紧张的低配置设备。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:37:05