Ale*_*tin 9 android rendering ffmpeg opengl-es bitmap
在我的本机线程中,我有FFMpeg获取并解码帧然后将它们放入队列中.
在Java方面,我有一个GLSurfaceView从Renderer.onDrawFrame我调用本地代码传递一个位图(该位图我只创建一次,然后每次都传递它).
在本机代码中,我得到队列的头部,使用AndroidBitmap_xxx函数将数据复制到java位图,然后在Java端将该位图渲染为纹理.
我想知道有更快的方式来呈现视频吗?我应该完全在本机代码中完成它,如果是的话,为什么它会更快?
编辑:我现在不将RGB帧像素复制到锁定的位图像素,而是将YUV帧直接解码为锁定的位图像素.这使得渲染速度明显加快(因为不再需要memcpy)仍然存在问题.
更改纹理中像素的最有效技术称为渲染到纹理,可以通过FBO在 OpenGL/OpenGL ES 中完成。在桌面 OpenGL 上,您可以使用像素缓冲区对象 ( PBO ) 直接在 GPU 上操作像素数据(但 OpenGL ES 尚不支持此功能)。
在未扩展的 OpenGL 上,您可以更改系统内存中的像素,然后使用 glTexImage2D/glTexSubImage2D 更新纹理 - 但这是低效的最后解决方案,应尽可能避免。glTexSubImage2D通常要快得多,因为它只更新现有纹理内的像素,而 glTexImage2D 创建全新的纹理(好处是您可以更改纹理的大小和像素格式)。另一方面,glTexSubImage2D 允许仅更新纹理的一部分。
你说你希望它与 OpenGL ES 一起工作,所以我建议执行以下步骤:
对于 FBO,代码可能如下所示:
// setup FBO
glGenFramebuffers( 1, &FFrameBuffer );
glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, YourTextureID, 0 );
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
// render to FBO
glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );
glViewport( 0, 0, YourTextureWidth, YourTextureHeight );
your rendering code goes here - it will draw directly into the texture
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
// cleanup
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glDeleteFramebuffers( 1, &FFrameBuffer );
Run Code Online (Sandbox Code Playgroud)
请记住,并非所有像素格式都可以渲染。RGB/RGBA 通常都很好。
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |