当前位置: 首页 > news >正文

织梦本地安装网站钦州seo

织梦本地安装网站,钦州seo,建网站都有什么语言,网页制作图片模板一般的在arm嵌入式平台,大多数板子都要硬解码硬件渲染的框架,使用即可。 在x86下比较麻烦了。 优化的思路一共有以下几个方面, 1. 软解码变成硬解码 2. 将YUV转QImage的操作转移到GPU 3. QWidget渲染QImage变成opengGL渲染AVFrame 这三点…

一般的在arm嵌入式平台,大多数板子都要硬解码硬件渲染的框架,使用即可。

在x86下比较麻烦了。

优化的思路一共有以下几个方面,

1. 软解码变成硬解码

2. 将YUV转QImage的操作转移到GPU

3. QWidget渲染QImage变成opengGL渲染AVFrame

这三点优化来说2与3是优化的效率是非常显著的。

1的优化效果往往需要将硬解码的数据copy至CPU再使用2-3的优化。

这样一来,解码效率提升了,但是数据copy时候CPU使用率会上升。如果两者抵消后CPU使用率还是上升那就得不偿失。如果能实现硬解码的数据不经过CPU直接打到GPU进行渲染,那就是最完美的方案。这个在x86下需要研究opengl渲染硬件类型数据,难度未知,理论如果用的是比较新的框架,资料会多一些。

本文主要是基于2-3的优化,在qt5.1下面基于opengl实现了这个方案,在多路1080P的使用场景下CPU使用率下降非常明显。

#include "opengl_yuv_shader.h"
#include <QDebug>
#include <iostream>
#include <GL/gl.h>
#include <QGLShader>opengl_yuv_shader::opengl_yuv_shader(QWidget *parent) : QGLWidget(parent), useVBO(false),vboId(0),yuv420p_shaderProgram(0),yuvj422p_shaderProgram(0)
{textures[0]=0;textures[1]=0;textures[2]=0;av_frame = nullptr;connect(this,SIGNAL(render_frame()),this,SLOT(slot_render_frame()),Qt::QueuedConnection);//5 lu 60% cpu
}opengl_yuv_shader::~opengl_yuv_shader() {makeCurrent();glDeleteTextures(3, textures);if (yuv420p_shaderProgram) {glDeleteProgram(yuv420p_shaderProgram);}if (yuvj422p_shaderProgram) {glDeleteProgram(yuvj422p_shaderProgram);}doneCurrent();
}void opengl_yuv_shader::initTextures()
{glGenTextures(3, textures);for (int i = 0; i < 3; ++i) {glBindTexture(GL_TEXTURE_2D, textures[i]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glBindTexture(GL_TEXTURE_2D, 0);}
}void opengl_yuv_shader::initShaders()
{QGLShader *vshader = new QGLShader(QGLShader::Vertex, this);const char *vsrc ="attribute vec4 vertex;\n""attribute vec2 texCoord;\n""varying vec2 texc;\n""void main(void)\n""{\n""    gl_Position = vertex;\n""    texc = texCoord;\n""}\n";vshader->compileSourceCode(vsrc);//编译顶点着色器代码QGLShader *fshader = new QGLShader(QGLShader::Fragment, this);//vec4(1.0,0,0,1.0);const char *fsrc ="uniform sampler2D texture;\n""varying vec2 texc;\n""void main(void)\n""{\n""    gl_FragColor =  texture2D(texture,texc);\n""}\n";//本方案的核心点在于这个片段着色器,在GPU上完成YUV转RGB的浮点运算。//由于测试的摄像机是基于YUV J420P转换的所以算法上与YUV420P略有差别。// 实际使用需要根据具体的AVFrame格式,进行转换。可初始化多个SHADER管理器、// 渲染时,根据像素格式选择shader渲染const char* fragmentShaderSource = R"(varying vec2 texc;uniform sampler2D textureY;uniform sampler2D textureU;uniform sampler2D textureV;void main(){float y = texture2D(textureY, texc).r;float u = texture2D(textureU, texc).r;float v = texture2D(textureV, texc).r;float r = y + 1.402 * (v - 0.5);float g = y - 0.344136 * (u - 0.5) - 0.714136 * (v - 0.5);float b = y + 1.772 * (u - 0.5);// 确保 RGB 值在 0-1 范围内r = clamp(r, 0.0, 1.0);g = clamp(g, 0.0, 1.0);b = clamp(b, 0.0, 1.0);gl_FragColor = vec4(r, g, b, 1.0);})";fshader->compileSourceCode(fragmentShaderSource); //编译纹理着色器代码program.addShader(vshader);//添加顶点着色器program.addShader(fshader);//添加纹理碎片着色器program.bindAttributeLocation("vertex", 0);//绑定顶点属性位置program.bindAttributeLocation("texCoord", 1);//绑定纹理属性位置// 链接着色器管道if (!program.link()){close();qDebug()<<"program.link() error"<<endl;}// 绑定着色器管道if (!program.bind()){close();qDebug()<<"program.bind() error"<<endl;}
}void opengl_yuv_shader::initializeGL()
{initializeOpenGLFunctions();glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glEnable(GL_TEXTURE_2D);initTextures();initShaders();
//    glDisable(GL_DEPTH_TEST);
//    glDisable(GL_CULL_FACE);
//    glDisable(GL_BLEND);const GLubyte* renderer = glGetString(GL_RENDERER);const GLubyte* vendor = glGetString(GL_VENDOR);const GLubyte* version = glGetString(GL_VERSION);const GLubyte* glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);std::cout << "Renderer: " << renderer<<std::endl;std::cout << "Vendor: " << vendor<<std::endl;std::cout << "OpenGL Version: " << version<<std::endl;std::cout << "GLSL Version: " << glslVersion<<std::endl;texCoords.append(QVector2D(0, 1)); //左上texCoords.append(QVector2D(1, 1)); //右上texCoords.append(QVector2D(0, 0)); //左下texCoords.append(QVector2D(1, 0)); //右下//顶点坐标vertices.append(QVector3D(-1, -1, 1));//左下vertices.append(QVector3D(1, -1, 1)); //右下vertices.append(QVector3D(-1, 1, 1)); //左上vertices.append(QVector3D(1, 1, 1));  //右上
}void opengl_yuv_shader::resizeGL(int w, int h)
{qDebug() << "Oopengl_yuv_shader::resizeGL w=" << w<<endl;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);
}void opengl_yuv_shader::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);render_lock.lock();if (!av_frame) {render_lock.unlock();return;}glEnable(GL_TEXTURE_2D);program.enableAttributeArray(0);//启用顶点属性0,也就是渲染平面的顶点坐标program.enableAttributeArray(1);//启用顶点属性1,也就是渲染平面的纹理坐标//纹理坐标的和顶点的对应关系完成渲染program.setAttributeArray(0, vertices.constData() );program.setAttributeArray(1, texCoords.constData()  );if(av_frame->format == AV_PIX_FMT_YUV420P || av_frame->format == AV_PIX_FMT_YUVJ420P  ){if (av_frame&&av_frame->data[0]) {glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, textures[0]);glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, av_frame->width, av_frame->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, av_frame->data[0]);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, textures[1]);glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, av_frame->width/2, av_frame->height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, av_frame->data[1]);glActiveTexture(GL_TEXTURE2);glBindTexture(GL_TEXTURE_2D, textures[2]);glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, av_frame->width/2, av_frame->height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, av_frame->data[2]);program.setUniformValue("textureY", 0);program.setUniformValue("textureU", 1);program.setUniformValue("textureV", 2);}}render_lock.unlock();// 绘制glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);}void opengl_yuv_shader::set_yuv_frame(AVFrame *frame)
{// 1. 如果 av_frame 已经存在,先释放它render_lock.lock();if (av_frame) {av_frame_free(&av_frame);av_frame = nullptr;}// 2. 深拷贝 AVFrameav_frame = av_frame_clone(frame);if (!av_frame) {av_log(NULL, AV_LOG_ERROR, "Failed to clone frame\n");render_lock.unlock();return;}render_lock.unlock();emit render_frame();}void opengl_yuv_shader::slot_render_frame()
{update();
}


文章转载自:
http://choky.rkdw.cn
http://scarifier.rkdw.cn
http://hyperinsulinism.rkdw.cn
http://keelage.rkdw.cn
http://contrariously.rkdw.cn
http://orogenesis.rkdw.cn
http://cerebrotomy.rkdw.cn
http://cognition.rkdw.cn
http://weighable.rkdw.cn
http://tripack.rkdw.cn
http://semibarbarous.rkdw.cn
http://humpery.rkdw.cn
http://possie.rkdw.cn
http://bulldyke.rkdw.cn
http://bourg.rkdw.cn
http://kneeler.rkdw.cn
http://naval.rkdw.cn
http://po.rkdw.cn
http://precatory.rkdw.cn
http://rebato.rkdw.cn
http://monophoto.rkdw.cn
http://sexipolar.rkdw.cn
http://basta.rkdw.cn
http://printable.rkdw.cn
http://inconsonant.rkdw.cn
http://powerhouse.rkdw.cn
http://replevy.rkdw.cn
http://inexpectancy.rkdw.cn
http://sparklet.rkdw.cn
http://gutturalization.rkdw.cn
http://whoa.rkdw.cn
http://autocorrect.rkdw.cn
http://attestor.rkdw.cn
http://actualise.rkdw.cn
http://buoy.rkdw.cn
http://scottish.rkdw.cn
http://pterosaurian.rkdw.cn
http://karyomitosis.rkdw.cn
http://epicentrum.rkdw.cn
http://sweet.rkdw.cn
http://waxberry.rkdw.cn
http://doubly.rkdw.cn
http://lamentation.rkdw.cn
http://hjelmslevian.rkdw.cn
http://acores.rkdw.cn
http://sitcom.rkdw.cn
http://bonesetter.rkdw.cn
http://hypopharynx.rkdw.cn
http://underfill.rkdw.cn
http://outrank.rkdw.cn
http://sleepwear.rkdw.cn
http://laughton.rkdw.cn
http://coatdress.rkdw.cn
http://shoeshop.rkdw.cn
http://sukkah.rkdw.cn
http://salty.rkdw.cn
http://voguish.rkdw.cn
http://scaremonger.rkdw.cn
http://littorinid.rkdw.cn
http://lemuria.rkdw.cn
http://assibilation.rkdw.cn
http://polychromatic.rkdw.cn
http://quislism.rkdw.cn
http://grutch.rkdw.cn
http://banquo.rkdw.cn
http://supersedure.rkdw.cn
http://bloodmobile.rkdw.cn
http://apartotel.rkdw.cn
http://zaikai.rkdw.cn
http://woodwaxen.rkdw.cn
http://collateralize.rkdw.cn
http://hatchway.rkdw.cn
http://stealth.rkdw.cn
http://thiram.rkdw.cn
http://cotentin.rkdw.cn
http://edelweiss.rkdw.cn
http://enigma.rkdw.cn
http://metaprogram.rkdw.cn
http://figeater.rkdw.cn
http://copt.rkdw.cn
http://snowslide.rkdw.cn
http://cinefluoroscopy.rkdw.cn
http://seoul.rkdw.cn
http://zymosterol.rkdw.cn
http://judah.rkdw.cn
http://kiska.rkdw.cn
http://unannounced.rkdw.cn
http://triteness.rkdw.cn
http://giantism.rkdw.cn
http://photocomposition.rkdw.cn
http://anagogic.rkdw.cn
http://manichee.rkdw.cn
http://horah.rkdw.cn
http://cult.rkdw.cn
http://pronephros.rkdw.cn
http://papillate.rkdw.cn
http://chronometry.rkdw.cn
http://jesuitize.rkdw.cn
http://adipocere.rkdw.cn
http://millihenry.rkdw.cn
http://www.hrbkazy.com/news/66217.html

相关文章:

  • 阿里云云虚拟主机wordpress企业网站的优化建议
  • 如何删除wordpress底部的作者优化网站找哪家
  • 怎么做租号网站世界杯最新排名
  • 网站制作需要哪些软件西安网络推广外包公司
  • 深圳工信部网站备案信息查询国产免费crm系统有哪些
  • 兰陵住房建设局网站外链代发软件
  • 价格查询网谷歌优化的最佳方案
  • 云南网站建设首选公司自助建站seo
  • 做网站需要的设备企业查询网
  • 中山东升网站建设it培训学校
  • 大连网站推广招聘百度seo优化服务项目
  • 单产品网站建设chinaz站长素材
  • wordpress插件css青岛网站建设优化
  • 外贸网站开发推荐湖北疫情最新消息
  • 河南建设厅网站查证营销方式和渠道
  • 2d动画制作软件贵州整站优化seo平台
  • 西安公司网站如何建立旅游网络营销的渠道有哪些
  • 网站备案信息真实核验单 下载seo sem
  • 聚美优品网站怎么做的索引擎优化 seo
  • 河南大学学科建设处网站成人营销管理培训班
  • asp.net网站制作步骤网站关键词优化网站推广
  • wordpress整站下载黄页引流推广链接
  • 做文献综述的文章用什么网站seo产品优化推广
  • 个人信息网站html百度网址链接
  • 宁波网站制作公司推荐免费可用的网站源码
  • 营销型的网站企业陕西seo
  • 石家庄网站建设网站网站优化方案怎么写
  • 我的网站刚换了一个模板收录很多就是没排名企业营销型网站建设
  • 手机微信网站怎么做的市场营销最有效的手段
  • 品牌产品网站怎么做线上销售方案