NV21像素取样
NV21是YUV的一种子格式
它对每个像素的Y分量都取值,而UV分量则是每相邻的四个像素共享一组
因为相邻像素的UV分量值一般区别都是不大的,这样就压缩了像素存储时占用的字节大小
NV21像素排列和旋转翻转
注意,这里的行列只是为了方便人理解,对内存进行了换行显示,实际在内存中,像素是以数组形式存储的,而不是表格
旋转和翻转代码
有了示意图以后,参照示意图编写旋转翻转代码就容易多了
大家在写这种代码时,一定不要靠脑袋凭空想象,大多人是不具备这种空间想象力的
每个像素的转换规则都是一样的,我们对照示意图,找出单个像素的变换规则
再遍历所有像素,就可以得到整张变换后的图像了,非常简单
其实变换规则无非就是,行列互换,左右互换,上下互换这几种规则相互组合而已
//旋转摄像头采集的NV21画面,得到推流画面,顺时针为正方向
public static void rotateNV21(int face, byte[] src, byte[] reversedBytes, byte[] rotatedBytes, int width, int height, int rotation) {
if (rotation == 90)
rotateNV21_90(src, rotatedBytes, width, height);
else if (rotation == 180)
rotateNV21_180(src, rotatedBytes, width, height);
else if (rotation == 270)
rotateNV21_270(src, rotatedBytes, width, height);
else
rotateNV21_0(src, rotatedBytes, width, height);
}
//将NV21画面原样保留
public static void rotateNV21_0(byte[] src, byte[] dst, int width, int height) {
System.arraycopy(src, 0, dst, 0, src.length);
}
//将NV21画面顺时针旋转90角度
public static void rotateNV21_90(byte[] src, byte[] dst, int width, int height) {
//旋转90度后的像素排列:
//新的行数=原来的列数
//新的列数=原来的高度-1-原来的行数
//每相邻的四个Y分量,共享一组VU分量
//旋转前VU分量在左上角,旋转后VU分量在右上角
int index = 0;
//旋转Y分量,放入dst数组
for (int y = 0; y
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?