以下是将AVFrame的像素数据从NV12格式转换为RGB24格式的示例代码:
void NV12ToRGB(AVFrame *frame, uint8_t *buffer) {
int width = frame->width;
int height = frame->height;
uint8_t *y = frame->data[0];
uint8_t *u = frame->data[1];
uint8_t *v = frame->data[2];
int stride_y = frame->linesize[0];
int stride_u = frame->linesize[1];
for (int j=0; j<height; j++) {
for (int i=0; i<width; i++) {
int Y = y[j*stride_y + i];
int U = u[(j/2)*stride_u + 2*(i/2)];
int V = v[(j/2)*stride_u + 2*(i/2)+1];
// Convert YUV to RGB
buffer[j*width*3 + i*3] = clip((298*(Y-16) + 409*(V-128) + 128)>>8);
buffer[j*width*3 + i*3+1] = clip((298*(Y-16) - 100*(U-128) - 208*(V-128) + 128)>>8);
buffer[j*width*3 + i*3+2] = clip((298*(Y-16) + 516*(U-128) + 128)>>8);
}
}
}
uint8_t clip(int value)
{
if(value > 255)
return (uint8_t)255;
else if(value < 0)
return (uint8_t)0;
else
return (uint8_t)value;
}
其中,NV12 是一种常见的 YUV420 格式,是先排列所有的Y分量(亮度),再把U、V 分量交替排列。在转换过程中,需要将 U、V 每个像素点内插至它周围的四个像素点,才能进行 RGB 转换。
内容由零声教学AI助手提供,问题来源于学员提问