我使用qt的qopenglwidget进行绘图,将ffmpeg解码的数据通过信号槽发送给它,但渲染速度略慢,求解答



  •     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, id_y);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_RED, pixel_w, pixel_h, 0, GL_RED, GL_UNSIGNED_BYTE, plane[0]);
        m_program->setUniformValue(textureUniformY, 0);
    
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, id_u);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[1]);
        m_program->setUniformValue(textureUniformU, 1);
    
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, id_v);
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[2]);
        m_program->setUniformValue(textureUniformV, 2);
    
        glDisable(GL_DEPTH_TEST);//should be put before glDrawArrays
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        glDisable(GL_DEPTH_TEST);
    

    这是paintGL()里的代码,实测我的widget渲染速度慢,SDL渲染速度正常。我知道SDL是先UpdateTexture(data),然后RENDER。想知道OPENGL那些函数做如下操作:将数据发过来提前绘制好,等到需要显示的时候,show一下就行。主要是想提高渲染速度



  • @flowerlove

     glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, pixel_w/2, pixel_h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, plane[2]);
    
    

    这个是耗时操作。
    要使用glTexSubImage2D来替换,并且用算法来优化调用,这样就好了。



  • @jiangcaiyang 0_1453691368011_QQ图片20160125110838.png
    已经改成sub,但速度仍然慢,注掉显示部分(opengl绘图),fps 29,视频文件的fps为29.加上显示之后fps只有23,单个窗口就已经降低了6帧。多个窗口不能看。



  • 你可能需要这么做,将视频数据渲染到FBO,然后多个窗口共享。Qt有很方便的QOpenGLFramebufferObject可以使用,具体还是看看Qt的帮助文档吧。



  • @jiangcaiyang 嗯,谢了。不过在这之前,有一个热心的群友告诉我,可以用PBO,或者新版本的函数glTexStorage2D,不知道您对此怎么看。



  • @jiangcaiyang 我的目标并不是多个窗口同时渲染一个文件。我做的是视频播放器,只不过是我测试的时候,打开了同一个而已。你说的这种方法,仅是为了多个窗口共享吗? 真实情况是有好多不同的视频需要播放



  • @flowerlove 那可能借助成熟的框架来做了。比如说听说QtAV挺好的,我还没有尝试过。
    https://github.com/wang-bin/QtAV


 

最近的回复

  • 随后在git for windows这个软件中输入

    git clone git@git.coding.net:jiangcaiyang1/qtdreamrelease_windows.git

    就可以获得一个空的项目了。其它的项目也是同样的操作方法。然后呢,将此作为自动构建的代码库吧。
    此次介绍就是这样~😘 😘 🐧

    阅读更多
  • 0_1540027445466_很好.jpg
    萌梦安装包的分发始终是一个难题。要有一个稳定并且有效的方法进行分包,才能让大家都能够享受到萌梦动作编辑器的最新功能。我们目前有两种分发的方法:

    离线安装包。通常的位置是
    1.1 百度云盘
    1.2 QQ群文件
    1.3 github
    其中百度云盘和QQ群文件不会定期地更新,只有github的文件会定期更新。因为构建脚本要求每次有更改,都让github的文件更新。

    在线安装包。通常的位置是
    2.1 百度云盘
    2.2 QQ群文件
    2.3 github
    这里在线安装包的代码库主要还是在github中,在线安装包非常依赖CDN加速。目前github这块儿在国内做得不太好,还是希望在国内找一个类似的加速。目前可以选的只有两家:

    码云

    coding

    因为以前做过coding的加速,目前coding已经和腾讯云战略合作,所有的代码都要迁移到腾讯云了。而且对于代码库的空间要求变高了。128M。目前我的一个账号显然满足不了要求。所以有必要再注册一个账号。

    下面记录一下新建coding代码库的方法,并且尝试将萌梦安装包的线上代码库部分移动到coding代码库中。

    注册

    到这个位置注册。

    https://coding.net/register

    相信很快就会带你跳转到腾讯云中。不过这里我选择的是邮箱的方式,因为我希望注册尽量多的账号。

    设置ssh密钥

    进入控制台后,是这样的:
    0_1540028446495_2eeb7e93-c15b-4c82-9b36-58e1c304ea3f-image.png
    这个时候,我们要先创建项目,然后ssh的公钥。
    0_1540028822318_b3e81b93-099c-42d5-820d-deaf8d445913-image.png

    创建以后,开始部署公钥。在这里:
    0_1540028925337_d8059b64-8535-45e5-ba4c-d7454505aa5a-image.png
    这期间最好用OpenSSL生成SSH密钥。
    我使用的是git for windows来生成密钥的。方法是

    ssh-keygen

    如果你生成好了密钥,可以直接打开密钥内容看看:

    cat ~/.ssh/id_rsa.pub

    然后粘贴到网站的文本框中。

    添加好了之后,勾选“准许推送权限”,需要推送代码到代码库中。

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔