1.
NV21转化为I420
对于如何获取Camera返回的YUV数据,不是本篇文章的重点,不了解的请自行百度谷歌。因为Camera返回的YUV数据只能是NV21和YV12两种,而libyuv的缩放旋转镜像的操作需要的是I420的数据格式,那么第一步就是将NV21(例子中Camera返回数据格式设置的是NV21)转化为I420了。方法如下:
#include "libyuv.h" void nv21ToI420(jbyte *src_nv21_data, jint width, jint height, jbyte *src_i420_data) { jint src_y_size = width * height; jint src_u_size = (width >> 1) * (height >> 1); jbyte *src_nv21_y_data = src_nv21_data; jbyte *src_nv21_vu_data = src_nv21_data + src_y_size; jbyte *src_i420_y_data = src_i420_data; jbyte *src_i420_u_data = src_i420_data + src_y_size; jbyte *src_i420_v_data = src_i420_data + src_y_size + src_u_size; libyuv::NV21ToI420((const uint8 *) src_nv21_y_data, width, (const uint8 *) src_nv21_vu_data, width, (uint8 *) src_i420_y_data, width, (uint8 *) src_i420_u_data, width >> 1, (uint8 *) src_i420_v_data, width >> 1, width, height); }
NTESYUVConverter
+ (NTESI420Frame *)pixelBufferToI420:(CVImageBufferRef)pixelBuffer
withCrop:(float)cropRatio
targetSize:(CGSize)size
andOrientation:(NTESVideoPackOrientation)orientation