Opengl 如何在不复制到CPU内存的情况下将ffmpeg纹理转换为Open GL纹理
此ffmpeg示例演示如何进行硬件解码: 在第109行,它这样做:Opengl 如何在不复制到CPU内存的情况下将ffmpeg纹理转换为Open GL纹理,opengl,video,ffmpeg,gpu,Opengl,Video,Ffmpeg,Gpu,此ffmpeg示例演示如何进行硬件解码: 在第109行,它这样做: /* retrieve data from GPU to CPU */ if ((ret = av_hwframe_transfer_data(sw_frame, frame, 0)) < 0) { /*从GPU向CPU检索数据*/ 如果((ret=av_帧_传输_数据(sw_帧,帧,0))data[I]指向CUDA图像的指针?我不知道是否可以直接从中创建OpenGL纹理,但您可以将复制操作减少到
/* retrieve data from GPU to CPU */
if ((ret = av_hwframe_transfer_data(sw_frame, frame, 0)) < 0) {
/*从GPU向CPU检索数据*/
如果((ret=av_帧_传输_数据(sw_帧,帧,0))<0){
我想避免这种情况,因为这需要时间。因此,我需要一种方法来重用GPU内存中的解码视频,以重新进行颜色转换
如何将GPU内存中的解码纹理转换为OpenGL中的纹理,而不必像上面的代码那样返回CPU内存?
如果以上不可能,如何使用opengl在解码视频中进行颜色转换?我听说ffmpeg支持将opengl着色器作为输入传递,所以我想这是可能的。简而言之:这很复杂 根据ffmpeg在您的系统上使用的硬件后端,您可能需要执行DirectX/CUDA/OpenGL互操作。假设您使用的是VDPAU后端,并且希望与OpenGL互操作。看起来ffmpeg没有以文档化的方式从其公共接口公开该功能 但是,根据实现,您似乎可以从
AVFrame
检索VdpVideoSurface
,如下所示:
VdpVideoSurface surf = (VdpVideoSurface)(uintptr_t)frame->data[3];
从这里,您可以通过和扩展将其传递到
vdpaureRegisterVideoSurfaceEnv
,以创建OpenGL纹理。非常感谢您,现在更清晰了!!事实上,我计划支持Jetson纳米板,所以我想我必须使用CUDA。我找到了同样的方法,但CUDA除外:但我没有看到任何“曲面”.我还找到了Direct X的互操作,但没有找到CUDA的互操作。可能是另一个文件?@LucasZanella:不是(CUdeviceptr)src->data[I]
指向CUDA图像的指针?我不知道是否可以直接从中创建OpenGL纹理,但您可以将复制操作减少到完全在GPU上,而无需进入系统内存。。