Dear Imgui 是一个立即模式的 C++ GUI lLibrary,与其他 GUI 框架不同,它将渲染与框架逻辑分离,用户可以根据自己的需要选择渲染方式,官方支持如下:

Renderers: DirectX9, DirectX10, DirectX11, DirectX12, OpenGL (legacy), OpenGL3/ES/ES2 (modern), Vulkan, Metal.
Platforms: GLFW, SDL2, Win32, Glut, OSX.

有时我们需要在 FFMpeg 应用中使用 GUI,传统的方式是将 FFMpeg 嵌入到 GUI 应用程序中, 有了 Imgui,我们可以在视频画面之上叠加我们的 GUI 界面。

关键步骤如下:

  1. 指定 FFmpeg 解码方式为 Dxva2
  2. 通过 shared handle 的方式创建共享 Surface
  3. 将 FFmpeg 解码得到的每帧画面 StretchRect 到该 Surface
  4. 在 Imgui 中将该 Surface 渲染为背景(也可作为窗口内容进行渲染)

要注意的是 D3D9ex 才能支持 shared handle,但是 FFmpeg 中初始化 D3D9ex 时会失败,自动回退到 D3D9. 可以通过手动创建 D3D9ex 相关设备并传入 AVCodecContext 来解决。