android ios录制视频数据进行旋转(90,180,270)与剪切
程序员文章站
2022-05-17 10:08:03
...
对android录制的NV21视频数据进行旋转(90,180,270)与剪切
android默认的视频采集格式是NV21,(属于YUV420)
在onPreviewFrame中传进来的byte[] data即为NV21格式。
首先拿到
List<Camera.Size> list = parameters.getSupportedPreviewSizes();
Camera.Size size size = list.get(0);
int mPreWidth= size.width;
int mpreheight = size.height;
在onPreviewFrame(byte[] data, Camera camera)中调用旋转90度
byte[] ryuv = rotateYUVDegree90_1(data, mPreWidth, mPreHeight);
private byte[] rotateYUVDegree90_1(byte[] data, int imageWidth, int imageHeight) {
byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
// Rotate the Y luma
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++;
}
}
// Rotate the U and V color components
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;
}
在onPreviewFrame(byte[] data, Camera camera)中调用旋转90度 byte[] ryuv = rotateYUV420Degree270(data, mPreWidth, mPreHeight);
private byte[] rotateYUV420Degree270(byte[] data, int imageWidth, int imageHeight){
byte[] yuv =new byte[imageWidth*imageHeight*3/2];
// Rotate the Y luma
int i =0;
for(int x = imageWidth-1;x >=0;x--){
for(int y =0;y < imageHeight;y++){
yuv[i]= data[y*imageWidth+x];
i++;
}
}
// Rotate the U and V color components
i = imageWidth*imageHeight;
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-1)];
i++;
yuv[i]= data[(imageWidth*imageHeight)+(y*imageWidth)+x];
i++;
}
}
return yuv;
}
在onPreviewFrame(byte[] data, Camera camera)中调用旋转90度
byte[] ryuv = rotateYUV420Degree180(data, mPreWidth, mPreHeight);
private byte[] rotateYUV420Degree180(byte[] data, int imageWidth, int imageHeight){
byte[] yuv =new byte[imageWidth*imageHeight*3/2];
int i =0;int count =0;
for(i = imageWidth * imageHeight -1; i >=0; i--){
yuv[count]= data[i];
count++;
}
i = imageWidth * imageHeight *3/2-1;
for(i = imageWidth * imageHeight *3/2-1; i >= imageWidth * imageHeight; i -=2){
yuv[count++]= data[i -1];
yuv[count++]= data[i];
}
return yuv;
}
裁剪NV21
public byte[] cropYUV420(byte[] data,int imageW,int imageH,int newImageH){
int cropH;
int i,j,count,tmp;
byte[] yuv =new byte[imageW*newImageH*3/2];
cropH =(imageH - newImageH)/2;
count =0;
for(j=cropH;j<cropH+newImageH;j++){
for(i=0;i<imageW;i++){
yuv[count++]= data[j*imageW+i];
}
} //Cr Cb
tmp = imageH+cropH/2;
for(j=tmp;j<tmp + newImageH/2;j++){
for(i=0;i<imageW;i++){
yuv[count++]= data[j*imageW+i];
}
}
return yuv;
}
将1280x720裁剪成720x720时用法如下:
byte[] outdata2; byte[] outdata; outdata2 = rotateYUV420Degree90(data, 1280, 720);//将1280x720旋转成720x640 outdata = cropYUV420(outdata2, 720, 1280,720);//将720x1280裁剪成720x720
下一篇: vue3插槽使用详解