如何转换yv12至yuv420p

时间:2013-05-06 05:35:21

标签: android java-native-interface

在相机预览框架上,我在Android端获得yv12格式的数据。我需要在jni端将其转换为YUV420P。我该怎么做?正如我从YUV420P格式的许多来源中读到的那样,首先出现y样本,然后是u样本。你的样本后跟v样本。 yv12格式与YUV420P相同,除了u和v样本以相反的顺序出现,这意味着y样本后跟v,然后是u样本。记住这一点我在编码之前使用了以下交换代码从yv12数据格式生成YUV420P数据。

avpicture_fill((AVPicture*)outframe, (uint8_t*)camData, codecCtx->pix_fmt, codecCtx->width, codecCtx->height);

uint8_t * buf_store = outframe->data[1];
outframe->data[1]=outframe->data[2];
outframe->data[2]=buf_store;

但它似乎没有起作用。我应该如何调整我的代码?

2 个答案:

答案 0 :(得分:0)

请使用avpicture_fill。我已经在我的应用程序中实现了这样,并且工作正常



picture->linesize[0] = frameWidth;
picture->linesize[1] = frameWidth/2;
picture->linesize[2] = frameWidth/2;

picture->data[0] = camData;
picture->data[1] = camData + picture->linesize[0]*frameHeight+picture->linesize[1]*frameHeight/2;
picture->data[2] = camData + picture->linesize[0]*frameHeight;

答案 1 :(得分:0)

可能您需要此方法:

  //yv12 to yuv420p  
  public  static void swapYV12toI420(final byte[] yv12bytes, final byte[] i420bytes, int width, int height) {
        int size = width * height;
        int part = size / 4;
        System.arraycopy(yv12bytes, 0, i420bytes, 0, size);
        System.arraycopy(yv12bytes, size + part, i420bytes, size, part);
        System.arraycopy(yv12bytes, size, i420bytes, size + part, part);
    }

对于收到的每个YV12数据包,请交换到i420。