使用这里提供的示例,我能够让FFMPEG通过CUDA解码HEVC编码的视频(任务管理器显示我的测试程序使用75%的GPU)。
我想更进一步,直接从GPU显示这些帧--很遗憾必须将它们下载到CPU (就像上面的示例代码所做的那样),将它们作为OpenGL纹理重新上传到GPU,特别是因为从YUV到RGB的转换在GPU上也更有效(而且我已经有一个着色器这样做了)。
编辑:为了澄清我要做什么,下面是FFMPEG通过avcodec_get_hw_config()和av_hwdevice_get_type_name报告的解码设备列表
Hardware configurations:
0: Device Type: dxva2
1: Device Type: (none)
2: Device Type: d3d11va
3: Device Type: cuda正如talonmies在评论中指出的,最后一个实际上是错误命名的,解码不是通过CUDA计算完成的,而是通过GPU芯片上的专用硬件(SIP)完成的。不过,毫无疑问,这是我需要使用的设备,尽管它将被更恰当地指定为"NVDEC“。
编辑2:查看负责通过NVDEC,cuviddec.c解码的FFMPEG源代码文件,似乎没有任何选项可以防止不必要的复制从设备(GPU)内存到主机(CPU)内存。这意味着,我很可能不得不自己编程针对NVDEC。
发布于 2022-05-28 22:45:01
查看示例cuda-samples/3_Imaging/cudaDecodeGL/ImageGL.cpp,您将看到它使用CUDA将OpenGL PBO映射为CUDA缓冲区对象(cuGLRegisterBufferObject或cuGraphicsGLRegisterBuffer),然后使用另一个CUDA API (cuGLMapBufferObject)将PBO内存用于CUDA处理。
不幸的是,在FFMPEG源代码中搜索任何这些函数都不会返回结果。
https://stackoverflow.com/questions/71279207
复制相似问题