加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:43:32 所属栏目:Windows 来源:网络整理
导读:我使用ffmpeg函数解码h264帧并在 windows平台上的窗口中显示.我使用的方法如下(从 FFMPEG Frame to DirectX Surface): AVFrame *frame;avcodec_decode_video(_ffcontext,frame,etc...);lockYourSurface();uint8_t *buf = getPointerToYourSurfacePixels();/
我使用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使用率降低了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读