我设置了一个onPreviewFrame回调。这将获得一个byte[],其中包含NV21数据。我已将预览大小设置为176*144。当设备处于横向模式时,176个*144个维度的byte[]是完美的,但是当设备处于纵向模式时,我仍然可以得到相同尺寸的byte[]。
我想把byte[]旋转90度,得到尺寸为144*176的byte[]。
所以问题是,如何旋转数据,而不仅仅是预览图像?Camera.Parameters.setRotation只影响拍照,而不是视频。Camera.setDisplayOrientation特别指出,它只影响显示预览,而不影响帧字节:
This does not affect the order of byte array passed in
onPreviewFrame(byte[], Camera), JPEG pictures, or recorded videos.在查看了各种帖子之后,我发现这有一个声明使用libyuv中的ConvertToI420。
现在,我已经编译了libyuv并能够调用libyuv::ConvertToI420 420方法,但是我得到的结果I420在颜色、显示线条和所有.然而,我得到的尺寸现在是144*176,可以检查图像这里。
我使用过的代码片段如下所示。
//sourceWidth = 176 and sourceHeight = 144
unsigned char I420M = new unsigned char[(int)(sourceWidth*sourceHeight*1.5)];
unsigned int YSize = sourceWidth * sourceHeight;
// yuvPtr is the NV21 data passed from onPreviewCallback (from JAVA layer)
const uint8* src_frame = const_cast<const uint8*>(yuvPtr);
size_t src_size = YSize;
uint8* pDstY = I420M;
uint8* pDstU = I420M + YSize;
uint8* pDstV = I420M + (YSize/4);
libyuv::RotationMode mode;
if(landscapeLeft){
mode = libyuv::kRotate90;
}else{
mode = libyuv::kRotate270;
}
uint32 format = libyuv::FOURCC_NV21;
int retVal = libyuv::ConvertToI420(src_frame, src_size,
pDstY, sourceHeight,
pDstU, (sourceHeight/2),
pDstV, (sourceHeight/2),
0, 0,
sourceWidth, sourceHeight,
sourceWidth, sourceHeight,
mode,
format);我不希望裁剪图像,只需旋转它90 (顺时针/逆时针方向)附加的图像是为kRotate90。
有人能帮我指出哪里出了问题吗?我强烈怀疑它是否能用传递给ConvertToI420方法的参数来做些什么。
任何帮助都很感激。
发布于 2015-05-21 08:28:06
我已经弄清楚出了什么问题。上面的代码片段工作得很好,I420M包含有144*176维旋转的YUV。
问题在于我在将I420M传递回jbyte[]层时将其转换为jbyte[]的方式。
发布于 2016-12-13 03:41:59
使用sourceWidth而不是sourceHeight int retVal = libyuv::ConvertToI420(src_frame, src_size, pDstY, sourceWidth, pDstU, (sourceWidth/2), pDstV, (sourceWidth/2), 0, 0, sourceWidth, sourceHeight, sourceWidth, sourceHeight, mode, format);
https://stackoverflow.com/questions/30347134
复制相似问题