2015-10-21 162 views
1

我有一個h264視頻流從yuv444p幀編碼,它使用vlc或mpv播放器播放良好。如何解碼從yuv444p幀編碼的h264視頻?

但是,當我試圖使用libavcodec解碼它,它看起來像這樣。

wrong result;

源框架是upsize down vlc-player標誌。

這裏是解碼器的intialization:

AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264); 
AVCodecContext *codecCtx = avcodec_alloc_context3(codec); 
avcodec_open2(codecCtx, codec, NULL); 

解碼器解碼從YUV420P編碼分組時運行良好。 解碼從yuv444p幀編碼的數據包時我錯過了什麼?

更新:我把yuv444p輸出轉換成帶有sws_scale()的BGRA,然後用下面的代碼進行轉換;

int offset_out = 0, offset_tmp = 0; 
uint32_t *tmp = (uint32_t *)malloc(width * height * 4); 
for (int i = 0; i < width * height; i++) { 
    if ((i + width + 9) % (width + 9) > width) { 
     out[offset_out++] = in[i]; 
    } else { 
     tmp[offset_tmp++] = in[i]; 
    } 
} 
memcpy(out + offset_out, tmp, offset_tmp); 
free(tmp); 

然後圖片看起來沒事。

i + width + 9中有一個9。我猜想,因爲我知道源圖片的寬度和高度。但是如果寬度或高度改變爲其他值,9不起作用。

我想知道解碼器有什麼問題。

+0

編輯你的問題,並把它放在一個代碼塊(四個領先的空格,而不是back-ticks)中,因爲它不太可讀。或者將您的解決方案作爲答案發布。另外,libavcodec還具有格式轉換功能。它的實現將利用矢量指令和其他可用的平臺上的其他內容。 –

+1

你是如何轉換成BGRA的?因爲你的line_stride肯定是個問題。 – szatmary

+0

ffmpeg轉換它好嗎? (命令行) – rogerdpack

回答

1

視頻有什麼像素格式?如果你使用ffmpeg編碼,除非你告訴它,否則它不會將色度下變換爲yuv420。默認情況下,它會創建一個yuv444 h.264流,libavcodec將解碼爲yuv444幀。如果你將這些字節解釋爲yuv420,它看起來不正確。從圖像來看,這可能是發生了什麼事。

如果您正在解碼RGB h.264流,libavcodec甚至可以爲您提供平面RGB(gbrp)輸出。

所以你必須檢查你從解碼器得到的像素格式,並相應地對待它。

+0

我檢查過像素格式,它是YUV444P。 –