一、前言

采用painter的方式绘制解码后的图片,方式简单易懂,巨大缺点就是占CPU,一个两个通道还好,基本上CPU很低,但是到了16个64个通道的时候,会发现CPU也是很吃紧(当然强劲的电脑配置另当别论),这就需要考虑用opengl来绘制了,采用opengl走的GPU,会占用很少的CPU(一般是部分运算),而且一般ffmpeg采集到的就是yuv数据,可以直接用opengl来绘制,并不需要转成rgb格式的图片,转换也会占用不少的CPU资源。在Qt中一般用QOpenGLWidget来绘制yuv数据,正常解码后的yuv420p格式以及硬解码后的NV12格式,这两种需要不同的代码去绘制,所以考虑可以分两个不同的QOpenGLWidget,也可以在一个widget中通过标志位设置是何种类型,然后再去调用对应的绘制代码。

其实QOpenGLWidget也可以绘制rgb数据,意味着采集到的qimage图片也可以将对应数据交给QOpenGLWidget来绘制,总体CPU占用比纯painter绘制低一些,但是比直接绘制yuv要高一些,毕竟采集到的数据默认是yuv,需要重新转换成rgb,这个转换过程又占用了一些CPU运算。至于为何会有这种需求?有一个原因是yuv有点色差,不知道什么原因,比如网上都是 rgb = mat3(1.0, 1.0, 1.0, 0.0, -0.39465, 2.03211, 1.13983, -0.58060, 0.0) * yuv; 或者 rgb = mat3(1.0, 1.0, 1.0, 0.0, -0.3455, 1.779, 1.4075, -0.7169, 0.0) * yuv; (推荐后者)里面这几个值慢慢