解决android opengl glReadPixels 慢的问题 二

解决android opengl glReadPixels 慢的问题 二
上篇讲到使用pbo解决glreadpix慢的问题,但是效果不太理想,后来参考链接:OpenGL Pixel Buffer Object (PBO)中介绍的2个PBO组成一个队列进行处理。效果会大大加强


1, 如上图所示,要创建2个PBO
GLES30.glGenBuffers(2, pbo);
            GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(0));
            GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
            GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(1));
            GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
            GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);


2, 使用 pbo进行操作
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(nextIndex));
        Buffer buf = GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT);
        ByteBuffer bytebuffer = ((ByteBuffer) buf).order(ByteOrder.nativeOrder());
        bb.put(bytebuffer);
        //tool.fwrite("/sdcard/src.rgba", bb.array(), bb.array().length, 0);
        video.RecordVideoAddFrame(bb.array(), mWidth, mHeight, 1, 1);
        GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
        long end = System.currentTimeMillis();
        Log.d("jni", "time = " + (end - start));
3,可以把读取的保存成视频进行处理
使用2个pbo过后,再我的手机上测试情况下,1080x1080的图片大概平均耗时10毫秒左右,有了质的提高, 这也满足了我们一般拍摄录制的需求,但是要求需要降低更

多,显示这种方式还不没达到我们最低的要求,请参照下篇介绍,把处理一桢的时间耗时2毫秒左右,这样会大大节省你录制视频的时间
————————————————
版权声明:本文为CSDN博主「程龙-音视频」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/c553110519/article/details/73294172

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值