android ffmpeg opengl es渲染电影

android ffmpeg opengl es渲染电影,第1张

概述我试图通过NDK渲染视频,添加一些在sdk中不支持的功能.我使用FFmpeg解码视频,可以通过ndk编译,并使用 this作为起点.我修改了这个例子,而不是使用glDrawTexiOES来绘制纹理,我已经设置了一些顶点,并在其上面渲染纹理(opengl es渲染四边形的方式). 下面是我要渲染的内容,但创建glTexImage2D的速度很慢.我想知道是否有任何方法可以加快速度,或者给出加快速度的外 我试图通过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 slowglTexImage2D(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,texCoords);glVertexPointer(3,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;}}
解决方法 是的,纹理(和缓冲区,着色器和帧缓冲区)创建很慢.

这就是你应该只创建一次纹理的原因.创建后,您可以通过调用glSubTexImage2D来修改其数据.

并且可以更快地上传纹理数据 – 创建两个纹理.当您使用一个显示时,将纹理数据从ffmpeg上传到第二个.当您显示第二个时,将数据上传到第一个.从头开始重复.

我认为它仍然不会很快.您可以尝试使用允许从NDK访问位图对象像素的jnigraphics库.之后 – 你只需在java端的屏幕上显示这个位图.

总结

以上是内存溢出为你收集整理的android ffmpeg opengl es渲染电影全部内容,希望文章能够帮你解决android ffmpeg opengl es渲染电影所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1121915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存