Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在不复制到CPU内存的情况下将ffmpeg纹理转换为Open GL纹理_Opengl_Video_Ffmpeg_Gpu - Fatal编程技术网

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

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纹理,但您可以将复制操作减少到

此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))<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上,而无需进入系统内存。。