windows – FFMPEG框架到DirectX表面硬件加速

前端之家收集整理的这篇文章主要介绍了windows – FFMPEG框架到DirectX表面硬件加速前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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,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,(AVPicture *)frame,_context->pix_fmt,_context->width,_context->height);


unlockYourSurface();

代码中,我使用sws_scale而不是img_convert.

当我将表面数据指针传递给sws_scale时(事实上在avpicture_fill中),似乎数据指针实际上在RAM而不是GPU内存上,当我想显示表面时,似乎数据被移动到GPU和然后显示.据我所知,在RAM和GPU内存之间复制数据时,cpu利用率很高.

我如何tel ffmpeg直接渲染到GPU内存上的表面(而不是RAM上的数据指针)?

解决方法

我找到了这个问题的答案.为了防止在使用ffmpeg显示帧时额外的cpu使用,我们不能将帧解码为RGB.几乎所有的视频文件都被解码为YUV(这是视频文件中的原始图像格式).这里的要点是GPU能够直接显示YUV数据而无需将其转换为RGB.据我所知,使用ffmpeg通常版本,解码数据总是在RAM上.对于帧,与相同帧的RGB解码等效物相比,YUV数据量非常小.因此,当我们将YUV数据移动到GPU而不是转换为RGB然后转移到GPU时,我们从两个方面加速操作:

>没有转换为RGB
> RAM和GPU之间移动的数据量减少

所以最后整体cpu使用率降低了.

猜你在找的Windows相关文章