我正在尝试从AVFrame中提取YUV像素数据,修改像素,然后将其放回FFmpeg。
我目前正在使用它来检索YUV缓冲区
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(base->format);
int baseSize = av_image_get_buffer_size(base->format, base->width, base->height, 32);
uint8_t *baseBuffer = (uint8_t*)malloc(baseSize);
av_image_copy_to_buffer(baseBuffer, baseSize, base->data, base->linesize, base->format, base->width, base->height, 32);
但我似乎无法正确定位该缓冲区中的像素。从源代码中他们似乎是将飞机堆叠在一起,导致我尝试这个
int width = base->width;
int height = base->height;
int chroma2h = desc->log2_chroma_h;
int linesizeY = base->linesize[0];
int linesizeU = base->linesize[1];
int linesizeV = base->linesize[2];
int chromaHeight = (height + (1 << chroma2h) -1) >> chroma2h;
int x = 100;
int y = 100;
uint8_t *vY = base;
uint8_t *vU = base +(linesizeY*height);
uint8_t *vV = base +((linesizeY*height) + (linesizeU*chromaHeight));
vY+= x + (y * linesizeY);
vU+= x + (y * linesizeU);
vV+= x + (y * linesizeV);
使用它,如果我尝试修改300,300-400,400
范围内的像素,我会得到一个比视频其余部分更暗的小方块,以及沿视频的水平黑暗条纹。原来的颜色仍然存在,所以我认为我仍然在所有3个指针上触摸Y平面。
如何实际击中我想要击中的像素?