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的值基本都相等,那就對比不出來了。

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