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

接收到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的值基本都相等,那就对比不出来了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章