wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了windows – FFMPEG框架到DirectX表面硬件加速大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我使用ffmpeg函数解码h264帧并在 windows平台上的窗口中显示.我使用的方法如下(从 FFMPEG Frame to DirectX SurfacE): AVFrame *frame; avcodec_decode_video(_ffcontext, frame, etc...); lockYourSurface(); uint8_t *buf = getPointerToYourS
我使用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 – FFMPEG框架到DirectX表面硬件加速全部内容,希望文章能够帮你解决windows – FFMPEG框架到DirectX表面硬件加速所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。