【发布时间】:2012-02-10 15:54:09
【问题描述】:
我正在尝试通过 NDK 渲染视频,以添加一些 sdk 中不支持的功能。我正在使用 FFmpeg 对视频进行解码,并且可以通过 ndk 对其进行编译,并使用 this 作为起点。我已经修改了该示例,而不是使用 glDrawTexiOES 来绘制纹理,而是设置了一些顶点并在其之上渲染纹理(opengl es 渲染四边形的方式)。
下面是我正在做的渲染,但创建 glTexImage2D 很慢。我想知道是否有任何方法可以加快速度,或者给出加快速度的外观,例如尝试在背景中设置一些纹理并渲染预设置纹理。或者是否有任何其他方法可以更快地将视频帧绘制到android中的屏幕上?目前我只能得到大约 12fps。
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, textureConverted);
//this is slow
glTexImage2D(GL_TEXTURE_2D, /* target */
0, /* level */
GL_RGBA, /* internal format */
textureWidth, /* width */
textureHeight, /* height */
0, /* border */
GL_RGBA, /* format */
GL_UNSIGNED_BYTE,/* type */
pFrameConverted->data[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
编辑 我更改了我的代码,只初始化了一次 gltextImage2D,并使用 glSubTexImage2D 对其进行了修改,但对帧率并没有太大的改善。
然后我修改了代码以修改 NDK 上的本机 Bitmap 对象。使用这种方法,我有一个后台线程,它运行处理下一帧并在本机端填充位图对象。我认为这有潜力,但我需要提高将 AVFrame 对象从 FFmpeg 转换为本机位图的速度。以下是我目前用来转换的方法,一种蛮力方法。有什么方法可以提高这个速度或优化这个转换?
static void fill_bitmap(AndroidBitmapInfo* info, void *pixels, AVFrame *pFrame)
{
uint8_t *frameLine;
int yy;
for (yy = 0; yy < info->height; yy++) {
uint8_t* line = (uint8_t*)pixels;
frameLine = (uint8_t *)pFrame->data[0] + (yy * pFrame->linesize[0]);
int xx;
for (xx = 0; xx < info->width; xx++) {
int out_offset = xx * 4;
int in_offset = xx * 3;
line[out_offset] = frameLine[in_offset];
line[out_offset+1] = frameLine[in_offset+1];
line[out_offset+2] = frameLine[in_offset+2];
line[out_offset+3] = 0;
}
pixels = (char*)pixels + info->stride;
}
}
【问题讨论】:
-
UPDATE:: 我得到了更好的帧速率,但是当使用上面的 fill_bitmap 方法从 ffmpeg 的帧输出转换图像时,图像是黑白的,并且我得到了图像的副本一边。
标签: android opengl-es android-ndk ffmpeg