Android上为了让视频显示的更流畅,自然要使用到NDK, 没有采用YUV420 overlay的方式, 而采用平台移植更安全的RGB565显示。 在android 2.3上测试通过。
但到了MTK andriod平台(A301)遇到glTexImage2D gl_error 0x501的错误(源图像为176*144)。 经过反复测试, 这个mtk andriod版本支持opengl es, 但对源图像的分辨率有奇怪的限制。当源尺寸宽高必须是64的倍数而且一般宽高为2倍的关系。比如512*256, 256*128都是可以的。只能先把图像缩放到256*128, 然后再用opengl es刷屏。
另外, OpenSL es在MTK的android上也还是可以用的。
~~~最后 贴上opengl es的sample code给大家参考咯
void OpenGL_Resize(jint screen_width, jint screen_height)
{
glDeleteTextures(1, &s_texture);
GLuint *start = s_disable_caps;
while (*start)
glDisable(*start++);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &s_texture);
glBindTexture(GL_TEXTURE_2D, s_texture);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glShadeModel(GL_FLAT);
check_gl_error("glShadeModel");
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
check_gl_error("glColor4x");
int rect[4] = {0, TEXTURE_HEIGHT, TEXTURE_WIDTH, -TEXTURE_HEIGHT};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
check_gl_error("glTexParameteriv");
VideoWidth = width;
VideoHeight = height;
}
static void render_video_opengl(unsigned char* rgb_buffer)
{
glClear(GL_COLOR_BUFFER_BIT);
glTexImage2D(GL_TEXTURE_2D,/* target */
0, /* level */
GL_RGB, /* internal format */
TEXTURE_WIDTH,/* width */
TEXTURE_HEIGHT,/* height */
0, /* border */
GL_RGB, /* format */
GL_UNSIGNED_SHORT_5_6_5,/* type */
rgb_buffer); /* pixels */
check_gl_error("glTexImage2D");
glDrawTexiOES(0, 0, 0, VideoWidth, VideoHeight);
check_gl_error("glDrawTexiOES");
}