如何在不复制到 CPU 内存的情况下将 ffmpeg 纹理转换为 Open GL 纹理

Luc*_*lla 5 opengl video gpu ffmpeg

这个 ffmpeg 示例演示了如何进行硬件解码:https : //github.com/FFmpeg/FFmpeg/blob/release/4.2/doc/examples/hw_decode.c

在第 109 行,它执行以下操作:

/* retrieve data from GPU to CPU */
            if ((ret = av_hwframe_transfer_data(sw_frame, frame, 0)) < 0) {
Run Code Online (Sandbox Code Playgroud)

我想避免这种情况,因为这需要时间。因此,我需要一种方法来重用 GPU 内存中的解码视频来重做颜色转换。

如何将 GPU 内存中的解码纹理转换为 Open GL 中的纹理,而不像上面的代码那样将其返回到 CPU 内存?

如果以上不可行,如何使用open gl在解码后的视频中进行颜色转换?我听说 ffmpeg 支持将 opengl 着色器作为输入传递,所以我想这是可能的。

ybu*_*ill 6

简而言之:这很复杂。

根据 ffmpeg 在您的系统上使用的硬件后端,您可能需要进行 DirectX/CUDA/OpenGL 互操作。假设您正在使用 VDPAU 后端并希望将其与 OpenGL 进行互操作。看起来 ffmpeg 没有以记录的方式从其公共接口公开该功能。

但是,基于vdpau_transfer_data_from实现,您似乎可以VdpVideoSurfaceAVFrame以下位置检索:

VdpVideoSurface surf = (VdpVideoSurface)(uintptr_t)frame->data[3];
Run Code Online (Sandbox Code Playgroud)

从这里,您可以将其传递给VDPAURegisterVideoSurfaceNVNV_vdpau_interopNV_vdpau_interop2扩展来创建 OpenGL 纹理。