Android中的NV21到I420

时间:2014-11-03 13:34:40

标签: android android-camera yuv

编辑:我遇到了这个执行NV21到I420转换的libyuv,但我真的不明白如何调用它。

// Convert NV21 to I420.  Same as NV12 but u and v pointers swapped.
LIBYUV_API
int NV21ToI420(const uint8* src_y, int src_stride_y,
           const uint8* src_vu, int src_stride_vu,
           uint8* dst_y, int dst_stride_y,
           uint8* dst_u, int dst_stride_u,
           uint8* dst_v, int dst_stride_v,
           int width, int height) 

我将从相机回调获得的NV21字节[]传递给jni图层并将其转换为unsigned char *,如下所示

int yuvBufLen = env->GetArrayLength(yuvNV21);
unsigned char* yuvNV21Buf = new unsigned char[yuvBufLen];
env->GetByteArrayRegion(yuvNV21, 0, yuvBufLen,reinterpret_cast<jbyte*>(yuvNV21Buf));

现在我不清楚如何获得调用libyuv函数NV21ToI420所需的不同参数。以下每个参数代表什么和  如何从unsigned char * yuvNV21Buf中获取它们?

const uint8 * src_y,
int src_stride_y,
const uint8 * src_vu,
int src_stride_vu,
uint8 * dst_y,
int dst_stride_y,
uint8 * dst_u,
int dst_stride_u,
uint8 * dst_v,
int dst_stride_v

我已经检查了这个obtain yuv420 in ios,它解释了如何获取所有必需的参数来调用libyuv :: NV12ToI420。

有人可以解释一下如何实现这个目标吗?

我通过下面的预览回调从相机捕捉帧字节[]

@Override
        public void onPreviewFrame(byte[] frameData, Camera camera) {

我正在获取的frameData采用NV21格式,我正在尝试将NV21转换为I420。

2 个答案:

答案 0 :(得分:0)

我无法使用我在问题中发布的方法,它一直在崩溃。

但是感谢Peter,我发现了NV21ToI420转换,这对我来说非常适合。

只需要NV21和I420指针。

unsigned char* yuvPtr; //NV21 data
unsigned char* I420 = new unsigned char[sourceWidth*sourceHeight*1.5]; //destination I420 pointer where the converted yuv will be stored 
NV21toI420(yuvPtr, I420, sourceWidth, sourceHeight);

多数人......

答案 1 :(得分:0)

添加到此(因为答案中的链接似乎已过期)。可以使用this代码将YUV格式转换为NV21。

所以我修改了这样的代码,将其转换为 I420。 Code here。现在它可以用于 mediaEncoder 生成的视频。