我使用ffmpeg函数解码h264帧并在windows平台的窗口中显示。我使用的方法如下(来自FFMPEG Frame to DirectX Surface):
AVFrame *frame;
avcodec_decode_video(_ffcontext, frame, etc...);
lockYourSurface();
uint8_t *buf = getPointerToYourSurfacePixels();
// Create an AVPicture structure which contains a pointer to the RGB surface.
AVPicture pict;
memset(&pict, 0, sizeof(pict));
avpicture_fill(&pict, buf, PIX_FMT_RGB32,
_ffcontext->width, _ffcontext->height);
// Convert the image into RGB and copy to the surface.
img_convert(&pict, PIX_FMT_RGB32, (AVPicture *)frame,
_context->pix_fmt, _context->width, _context->height);
unlockYourSurface();
在代码中,我使用sws_scale而不是img_convert。
当我将表面数据指针传递给sws_scale时(事实上在avpicture_fill中),似乎数据指针实际上在RAM而不是在GPU内存上,当我想显示表面时,似乎数据被移动了到GPU然后显示。据我所知,当数据在RAM和GPU内存之间复制时,CPU利用率很高。
如何将ffmpeg直接渲染到GPU内存上的表面(而不是RAM上的数据指针)?
答案 0 :(得分:1)
我找到了这个问题的答案。为了防止在使用ffmpeg显示帧时额外的CPU使用,我们不能将帧解码为RGB。几乎所有的视频文件都被解码为YUV(这是视频文件中的原始图像格式)。这里的要点是GPU能够直接显示YUV数据而无需将其转换为RGB。据我所知,使用ffmpeg通常版本,解码数据总是在RAM上。对于帧,与相同帧的RGB解码等效物相比,YUV数据量非常小。因此,当我们将YUV数据移动到GPU而不是转换为RGB然后转移到GPU时,我们会从两个方面加快操作:
最后整体CPU使用率下降。