gpt4 book ai didi

android ffmpeg opengl es 渲染电影

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:20 24 4
gpt4 key购买 nike

我正在尝试通过 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 上的原生位图对象。通过这种方法,我有一个运行处理下一帧并在 native 端填充位图对象的后台线程。我认为这有潜力,但我需要提高将 AVFrame 对象从 FFmpeg 转换为 native 位图的速度。下面是我目前用来转换的,一种蛮力方法。有什么方法可以提高这种转换的速度或优化这种转换?

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;
}
}

最佳答案

是的,纹理(以及缓冲区、着色器和帧缓冲区)创建速度很慢。

这就是为什么你应该只创建一次纹理。创建完成后,可以调用glSubTexImage2D修改其数据。 .

为了更快地上传纹理数据 - 创建两个纹理。当您使用一个显示时,将纹理数据从 ffmpeg 上传到第二个。当您显示第二个时,将数据上传到第一个。并从头开始重复。

我觉得还是不会很快。您可以尝试使用允许从 NDK 访问位图对象像素的 jnigraphics 库。之后 - 您只需在 Java 端的屏幕上显示此位图。

关于android ffmpeg opengl es 渲染电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com