在相机预览框架上,我在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;
但它似乎没有起作用。我应该如何调整我的代码?
答案 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。