ffmpeg解析HD264后图像上下翻转和颜色不对解决方法

时间:2020-12-07 04:53:47

接收到hd264的数据用ffmpeg进行解析后发现,画面是上下翻转的,网上有的人说可以在显示的时候在把图像上下翻转过来,但这样的效率明显很低,后来发现还有更高效的方法,只需要重排几个数组的地址就可以了:

    int result = avcodec_decode_video2(codec_, pFrame_, &got_frame, &pkt);

//关键是这一步,上下翻转图像
pFrame_->data[0] += pFrame_->linesize[0] * (codec_->height - 1);
pFrame_->linesize[0] = -pFrame_->linesize[0];
pFrame_->data[1]+= pFrame_->linesize[1] * (codec_->height / 2 - 1);
pFrame_->linesize[1] = -pFrame_->linesize[1];
pFrame_->data[2] += pFrame_->linesize[2]* (codec_->height / 2 - 1);
pFrame_->linesize[2] = -pFrame_->linesize[2];

//图像翻转完之后回到正常的读写步骤
length = av_image_copy_to_buffer((unsigned char*)vopBuf, 640*480*4,
(const uint8_t* const *)pFrame_->data, (const int*) pFrame_->linesize,
codec_->pix_fmt, codec_->width, codec_->height, 1);

图像翻转完之后,发现颜色依然不对,一开始还以为只是Android虚拟机的问题,结果放到真机上依然存在这个问题,颜色是有但颜色不对,形状轮廓都没错,表明接收的数据是没问题的,应该是显示的问题,后来我就把原始图像和最终显示图像相同位置的地方取色出来对比,发现R和B的值对调了,最高效的方法应该就是在yuv转RGB的时候直接把R和B的地址对调了:

/*
rgb[0] = py+rdif; // R
rgb[1] = py-invgdif; // G
rgb[2] = py+bdif; // B
*/
rgb[0] = py+bdif; // B
rgb[1] = py-invgdif; // G
rgb[2] = py+rdif; // R

当然,如果要取色对比的时候,最好不要取黑、白、灰的颜色,因为RGB的值基本都相等,那就对比不出来了。