我使用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


 

走马观花

最近的回复

  • QQ.png

    read more
  • 原来的号上不去了。。。。。不知道咋回事,可能是Github登录的?
    这个项目时隔3年又更新了,虽然偷了很多懒。。。。

    虽然这几年我一直编译Qt,不过已经很少编译这么全套的了。。。。。

    read more
  • 第一就是进入体验期:就是网友们刚刚进入网站的时候,心态处于体验状态,自然不会充值大额,所以这个阶段提款就是正常的,不会有什么情况。第二就是网站考量期:这个阶段是网友们已经玩了一段时间了,网站就会通过网友们这些天的投注情况来考量这个客户的质量,假如是大客户的话,那你就算赢十个八个网站还是会给你提款的,因为你后面还可以给网站带来更大的利益。第三就是网站拖延期,这个阶段就是网站决定黑你但是还想让你继续充值继续玩的时候,网站会以你的IP异常,注单违规,涉嫌套利等为借口拖着就是不给你提款。第四就是网站黑钱期,这个阶段就是网站觉得你身上的利益已经被他们套光了,网站也就不想在你身上浪费时间了,所以就冻结你的账号然后拉黑你。

    在这里我想说的是,如果我们的账号还没有到网站黑钱的最后一个阶段,只是出款需要审核,总是提不了款,但账号还可以正常登录,额度可以正常转换的时候可以寇+(二二其....久连连..六舞二桑)没有前期

    read more

关注我们

微博
QQ群











召唤伊斯特瓦尔