android - 是否有比使用 AndroidBitmap_xxx 函数更快的视频渲染解决方案?

标签 android opengl-es bitmap ffmpeg rendering

在我的 native 线程中,我使用 FFMpeg 获取和解码帧,然后将它们放入队列中。

在 Java 方面,我有一个 GLSurfaceView 并且从 Renderer.onDrawFrame 调用 native 代码传递一个位图(该位图我只创建一次,然后传递每次都是)。

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

我想知道是否有更快的方式来渲染视频?我应该完全用 native 代码来做吗,如果是的话,为什么它会更快?

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

最佳答案

更改纹理中像素的最有效技术称为渲染到纹理,可以通过 FBOs 在 OpenGL/OpenGL ES 中完成。 .在桌面 OpenGL 上,您可以使用像素缓冲区对象 (PBOs) 直接在 GPU 上操作像素数据(但 OpenGL ES 尚不支持此功能)。

在未扩展的 OpenGL 上,您可以更改系统内存中的像素,然后使用 glTexImage2D/glTexSubImage2D 更新纹理 - 但这是低效的最后手段解决方案,应尽可能避免。 glTexSubImage2D 通常要快得多,因为它只更新现有纹理内的像素,而 glTexImage2D 创建全新的纹理(作为一个好处,您可以更改纹理的大小和像素格式)。另一方面,glTexSubImage2D 允许只更新部分纹理。

你说你希望它与 OpenGL ES 一起工作,所以我建议执行以下步骤:

  • 将 glTexImage2D() 替换为 glTexSubImage2D() - 如果您获得了足够的性能,就这样吧;
  • 使用 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 通常都可以。

关于android - 是否有比使用 AndroidBitmap_xxx 函数更快的视频渲染解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165244/

相关文章:

android - 如何在 iOS 中使用带有自定义 map 服务器的 openstreetmap,Swift 任何库?

java - 具有操作功能的大 ImageView

android - WebView 方向更改不调整网页大小

ios - 用于在 iOS 中显示 FFT 的高性能图表

android - 未可靠地调用 UtteranceProgressListener

ios - 在 iOS OpenGL ES 上渲染到纹理——适用于模拟器,但不适用于设备

ios - 函数 glGenFramebuffers 的隐式声明

c# - 将所有绘制的对象保存到位图中

android - 加入大图像时出现 OutOfMemory 错误

android - 动画 ImageView 的位图位置