2

在相机预览帧上,我在 Android 端获取 yv12 格式的数据。我需要将它转换为 jni 端的 YUV420P。我该怎么做?正如我从 YUV420P 格式的许多来源中读到的那样,y 样本首先出现,然后是 u 样本。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;

但这似乎不起作用。我应该如何调整我的代码?

4

2 回答 2

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;
于 2014-01-22T13:14:20.487 回答
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。

于 2019-11-02T01:18:29.323 回答