您的位置:首页 > 移动开发 > Android开发

android开发直播将yvu420顺时针逆时针各旋转90度

2016-09-20 15:55 706 查看
做android手机直播的时候遇到在Camera的回到onPreviewFrame获得的数据帧传输到jni层,但是视频方向是有问题的,所以在网上找了许多yuv分量旋转的代码,最后适用的这两个还是比较不错的,

/**

* 视频顺时针旋转90

* */

private byte[] rotateYUV420Degree90(byte[] data, int imageWidth,

int imageHeight) {

byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];

int i = 0;

for (int x = 0; x < imageWidth; x++) {

for (int y = imageHeight - 1; y >= 0; y--) {

yuv[i] = data[y * imageWidth + x];

i++;

}

}

i = imageWidth * imageHeight * 3 / 2 - 1;

for (int x = imageWidth - 1; x > 0; x = x - 2) {

for (int y = 0; y < imageHeight / 2; y++) {

yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];

i--;

yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth)

+ (x - 1)];

i--;

}

}

return yuv;

}

/**

* 视频逆时针旋转90

* */

public void YUV420spRotateNegative90(byte[] dst, byte[] src, int srcWidth,

int height) {

int nWidth = 0, nHeight = 0;

int wh = 0;

int uvHeight = 0;

if (srcWidth != nWidth || height != nHeight) {

nWidth = srcWidth;

nHeight = height;

wh = srcWidth * height;

uvHeight = height / 2;

}

// 旋转Y

int k = 0;

for (int i = 0; i < srcWidth; i++) {

int nPos = srcWidth - 1;

for (int j = 0; j < height; j++) {

dst[k] = src[nPos - i];

k++;

nPos += srcWidth;

}

}

for (int i = 0; i < srcWidth; i += 2) {

int nPos = wh + srcWidth - 1;

for (int j = 0; j < uvHeight; j++) {

dst[k] = src[nPos - i - 1];

dst[k + 1] = src[nPos - i];

k += 2;

nPos += srcWidth;

}

}

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 视频旋转