如何在Android上实时渲染由MediaCodec解码到SurfaceView的图像数据(YUV420SP)?

时间:2016-08-25 11:02:41

标签: android h.264 mediacodec

MediaCodec有一个限制FPS的解码,我想打破它,所以我需要自己渲染帧,而不是MediaCodec的内部功能。

我假设只有RGB565可以在Android平台上渲染到SurfaceView。 我一直在Android上搜索YUV420-> RGB565的许多解决方案,但所有解决方案都需要分离Y U V数据,但是将YUV420SP数据分成Y U V需要花费很多时间。

我该如何解决?

感谢所有帮助过的人。

@Codo

                                if(colorFmt == 21) {
                                int nSize = bufferInfo.size / 6;
                                byte[] buf = new byte[bufferInfo.size];
                                byte[] y = new byte[nSize * 4];
                                byte[] u = new byte[nSize];
                                byte[] v = new byte[nSize];
                                ByteBuffer decoded = mc.getOutputBuffer(outputBufferIndex);
                                if(decoded != null) {
                                    decoded.get(buf);
                                    System.arraycopy(buf, 0, y, 0, nSize * 4);
                                    for(int i = 0; i < nSize; ++i) {
                                        u[i] = buf[nSize*4 + i*2];
                                        v[i] = buf[nSize*4 + i*2 + 1];
                                    }
                                }

1 个答案:

答案 0 :(得分:0)

您不需要生成RGB用于显示。您可以使用适当的着色器使用OpenGL,这样可以节省大量时间。

但如果您真的想尽快将NV21帧转换为RGB,请考虑renderscript