最近使用ffmpeg制作播放器,刚开始在自己的pc电脑中实现播放器的解码、yuv转RGB、图片的缩放、、、、、
一切看起来还算胜利,播放器最终能够很好的播放视频,以为可以松一口气了,当我将我的播放器交叉编译到
全志T3平台上(一款后视镜)发现播放视频时有点卡顿,经过一翻打印测试后发现,播放过程中丢帧比较严重,
导致这种现象的主要原因是由于在视频帧更新绘制时比较耗时(20ms),还有就是yuv数据转RGB数据时也比较
耗时,通过更改ffmpeg的处理算法最终由开始的120ms降低到32ms。但是实时性还是很低,于是考虑了使用
openGL,借助GPU的力量来提高效率,于是便开始了我openGL的学习之路。以下是自己折腾的第一程序
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
//注意是GL_LINES而不是GL_LINE,开始少了个s使得怎么都不出直线,还以为环境没弄好
glBegin(GL_LINES);
//指定顶点的命令必须包含在glBegin函数和glEnd函数之间,否则指定的点将被忽略
glColor3f(1.0, 0, 0); //设置直线颜色
glVertex3f(-1, 0, 0); //指定顶点
glVertex3f(1, 0, 0);
/* OpenGL 提供了一系列函数。它们都以 glVertex 开头,后面跟一个数字和 1~2 个字母。
* 例如: glVertex2d、glVertex2f、glVertex3f、glVertex3fv等等。
* 数字表示参数的个数,2 表示有两个参数,3 表示三个,4 表示四个。
* 字母表示参数的类型,s 表示 16 位整数(OpenGL 中将这个类型定义为 GLshort),
* i 表示 32 位整数(OpenGL 中将这个类型定义为 GLint 和 GLsizei),
* f 表示 32 位浮点数(OpenGL 中将这个类型定义为 GLfloat 和 GLclampf),
* d 表示 64 位浮点数(OpenGL 中将这个类型定义为 GLdouble 和 GLclampd)。
* v 表示传递的几个参数将使用指针的方式*/
glEnd();
//保证前面的opengl命令立即执行而不是让它们在缓冲区中
glFlush();
}
//以下代码比较固定
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("opengl 3d view");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
程序运行结果: