有没有比使用AndroidBitmap_xxx函数更快的video渲染解决scheme?

在我的本地线程,我有FFMpeg获取和解码帧,然后把它们放在队列中。

在Java方面,我有一个GLSurfaceView和从Renderer.onDrawFrame我打电话到本地代码传递一个位图(该位图我只创build一次,然后传递它每次)。

在本地代码中,我得到队列的头部,使用AndroidBitmap_xxx函数将数据复制到java位图,然后在Java端将该位图渲染为纹理。

我不知道有更快的方式来呈现video? 如果是的话,我可以用本地代码完成吗?为什么它会更快?

编辑:我现在不要将RGB帧像素复制到locking的位图像素,而是将YUV帧直接解码成locking的位图像素。 这使得渲染速度显着加快(因为不再有不必​​要的memcpy)仍然是个问题。

Solutions Collecting From Web of "有没有比使用AndroidBitmap_xxx函数更快的video渲染解决scheme?"

改变纹理中像素的最有效技术叫做渲染到纹理,可以通过FBO在OpenGL / OpenGL ES中完成。 在桌面OpenGL上,您可以使用像素缓冲区对象( PBO )来直接在GPU上操作像素数据(但OpenGL ES目前还不支持)。

在未使用OpenGL的情况下,您可以更改系统内存中的像素,然后使用glTexImage2D / glTexSubImage2D更新纹理 – 但是这是效率不高的最后解决scheme,应尽可能避免。 glTexSubImage2D通常要快得多,因为它只更新现有纹理中的像素,而glTexImage2D创build全新的纹理(作为一个好处,您可以更改纹理的大小和像素格式)。 另一方面,glTexSubImage2D允许仅更新纹理的一部分。

你说你想让它与OpenGL ES一起工作,所以我build议按照以下步骤操作:

  • 用glTexSubImage2D()replaceglTexImage2D() – 如果你获得了足够的性能,就让它成为;
  • 使用FBO和着色器实现渲染到纹理 – 要重写代码需要更多的工作,但会带来更好的性能。

对于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 ); 

请记住,不是所有的像素格式都可以渲染到。 RGB / RGBA通常很好。