gpt4 book ai didi

android - 在 Android 上使用像素缓冲对象 (PBO)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:02:08 27 4
gpt4 key购买 nike

在 Android 上,我尝试对相机帧执行一些 OpenGL 处理,在相机预览中显示这些帧,然后在视频文件中对这些帧进行编码。我正在尝试使用 OpenGL,使用 GLSurfaceView 和 GLSurfaceView.Renderer 以及使用 FFMPEG 进行视频编码。

我已经使用着色器成功处理了图像帧。现在我需要将处理后的帧编码为视频。 GLSurfaceView.Renderer 提供了 onDrawFrame(GL10 ..) 方法。正是在这种方法中,我试图仅使用 glReadPixels() 读取图像帧,然后将帧放在队列中以编码为视频。 glReadPixels() 本身就太慢了——我的帧率只有个位数。我正在尝试使用像素缓冲区对象来加快速度。这是行不通的。插上pbo后,帧率不变。这是我第一次使用 OpenGL,我不知道从哪里开始寻找问题。我这样做对吗?谁能给我一些指导?提前致谢。

public class MainRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {

.
.

public void onDrawFrame ( GL10 gl10 ) {

//Create a buffer to hold the image frame
ByteBuffer byte_buffer = ByteBuffer.allocateDirect(this.width * this.height * 4);
byte_buffer.order(ByteOrder.nativeOrder());

//Generate a pointer to the frame buffers
IntBuffer image_buffers = IntBuffer.allocate(1);
GLES20.glGenBuffers(1, image_buffers);

//Create the buffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, image_buffers.get(0));
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, byte_buffer.limit(), byte_buffer, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, image_buffers.get(0));

//Read the pixel data into the buffer
gl10.glReadPixels(0, 0, this.width, this.height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, byte_buffer);

//encode the frame to video
enQueueForEncoding(byte_buffer);

//unbind the buffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}

.
.

}

最佳答案

我以前从未尝试过类似的东西(opengl+video enconding),但我可以告诉你从设备内存中读取的速度很慢。尝试双缓冲,这可能会有所帮助,因为 GPU 可以在 DMA Controller 读回内容时继续渲染到第二个缓冲区。

加载分析器(检查您设备的 GPU 供应商),这可能会给您一些想法。另一件可能有帮助的事情是将内部 pbuffer 格式设置为其他格式,尝试较低的数字并删除一个 channel (alpha)。

编辑:如果您有这种感觉,您可以在 GPU 上对视频进行编码,这将提升您的应用程序的内存和处理能力。

关于android - 在 Android 上使用像素缓冲对象 (PBO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16404731/

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