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

Delphi加载/卸载FFmpeg的avfilter-7.dll出现句柄泄漏求助

关于Delphi加载/卸载avfilter-7.dll导致句柄泄漏的问题分析与解决建议

核心问题分析

你的LoadLibrary/FreeLibrary调用语法本身没有错误,但FFmpeg 4.2.2版本的avfilter-7.dll存在需要显式初始化/清理全局资源的逻辑,直接加载卸载会导致内部未释放的句柄残留;而旧版avfilter-2.dll设计更简单,无需手动处理这些步骤,因此没有泄漏。

必须补充的操作步骤

FFmpeg的组件DLL并非独立运行,需要遵循完整的初始化-使用-清理流程,具体如下:

1. 加载所有依赖的FFmpeg DLL

avfilter-7.dll依赖avutil、avcodec等核心组件,必须按顺序加载这些依赖DLL(版本需与avfilter-7.dll匹配,比如FFmpeg 4.2.2对应的是avutil-56.dll、avcodec-58.dll等),不能单独加载avfilter-7.dll。

2. 调用FFmpeg初始化函数

加载完成后,必须调用对应的初始化函数完成全局资源的初始化:

  • av_register_all():注册所有FFmpeg组件(需从avutil.dll获取)
  • avfilter_register_all():注册所有滤镜(需从avfilter-7.dll获取)

3. 卸载前执行清理操作

在调用FreeLibrary之前,需要:

  • 确保所有创建的滤镜上下文、帧等业务资源已销毁(如果有使用滤镜功能)
  • 调用avfilter_uninit()(从avfilter-7.dll获取)完成滤镜模块的全局资源清理

4. 按相反顺序卸载DLL

卸载时需要按照与加载相反的顺序释放DLL,避免依赖残留。

修正后的示例代码

var
  hAvUtil, hAvCodec, hAvFilter: THandle;
  av_register_all: procedure; cdecl;
  avfilter_register_all: procedure; cdecl;
  avfilter_uninit: procedure; cdecl;
begin
  // 按依赖顺序加载FFmpeg DLL
  hAvUtil := LoadLibrary(PAnsiChar('c:\Windows\SysWow64\avutil-56.dll'));
  hAvCodec := LoadLibrary(PAnsiChar('c:\Windows\SysWow64\avcodec-58.dll'));
  hAvFilter := LoadLibrary(PAnsiChar('c:\Windows\SysWow64\avfilter-7.dll'));

  if (hAvUtil <> 0) and (hAvCodec <> 0) and (hAvFilter <> 0) then
  begin
    // 执行初始化
    @av_register_all := GetProcAddress(hAvUtil, 'av_register_all');
    if Assigned(av_register_all) then av_register_all;

    @avfilter_register_all := GetProcAddress(hAvFilter, 'avfilter_register_all');
    if Assigned(avfilter_register_all) then avfilter_register_all;

    // 此处可添加滤镜相关业务逻辑

    // 执行清理
    @avfilter_uninit := GetProcAddress(hAvFilter, 'avfilter_uninit');
    if Assigned(avfilter_uninit) then avfilter_uninit;

    // 按相反顺序卸载DLL
    FreeLibrary(hAvFilter);
    FreeLibrary(hAvCodec);
    FreeLibrary(hAvUtil);
  end;

  // 重置句柄
  hAvFilter := 0;
  hAvCodec := 0;
  hAvUtil := 0;
end;

额外排查建议

  • 用Process Explorer查看泄漏的句柄类型:如果是文件句柄,检查avfilter是否加载了未关闭的配置/资源文件;如果是线程句柄,确认是否有后台线程未被终止。
  • 确保所有FFmpeg DLL版本完全一致,混合不同版本的DLL会引发各种资源泄漏或崩溃问题。
  • 若更新至更高版本FFmpeg后泄漏更严重,说明新版本的资源管理逻辑更复杂,更严格要求遵循初始化-清理流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:40:36