使用OpenGL ES2.0实现了 如下三个功能:
1.RGB转YUV420P
2.YUV420P转RGB
3.显示rgb到屏幕
转码过程使用shader实现,但有几点需要注意:
一.RGB转YUV的时候,输入的图的大小的宽度必须是8的倍数,原因如下:
转换后的yuv数据是按如下方式存储的
|||||||||||||||||||||||||||||||||||||
| | | |
| | | |
| | U | |
| | | |
| |______| |
| Y | | |
| | V | |
| | | |
| | | |
|||||||||||||||||||||||||||||||||||||
0 0.25 0.375 1.0 (宽度)
其中yuv数据只占了原图3/8的大小,如果宽度不为8的整数倍,则后面一定会出现小数,这时,GPU就可能少取像素了,实测如下:
1500x750的图
实际有效像素为1500 *3/8列 =562.5列,但这里很明显Opengl少处理了一个像素(实际只有半个像素也就是2个字节的U或V)只有562列,因此最终的图最后4列一定不正常。
1520x750
实际有效像素为1520 *3/8列 =570列,是整数,正好opengl也处理到了570,所以出来的图像没问题。
当然会有人问了为什么不直接横着弄成前面全是Y后面跟上UV呢?
这里我有做过一个测试,shader在assets文件夹里,有兴趣可以自己尝试,反正我试出来的图是这样的:
可以看到有很多成块的像素,基本上就是4列4列的块。目前还不知道原因。
二、转码的图宽度还需要小于2044或2048,如果大于2044的图,前面的所有像素都是正常的但2044以后 也是会出现4列4列的块,我也不知道为什么。
测试图3840x2160 ,放大后图的右半部分有明显的4列的痕迹。
三、rgb转yuv和yuv转rgb的颜色转换公式要配对使用,否则会出现偏色的情况。
基本上要注意的就是以上3点。剩下的自己去调试看吧。