我有一個h264視頻流從yuv444p幀編碼,它使用vlc或mpv播放器播放良好。如何解碼從yuv444p幀編碼的h264視頻?
但是,當我試圖使用libavcodec解碼它,它看起來像這樣。
源框架是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
不起作用。
我想知道解碼器有什麼問題。
編輯你的問題,並把它放在一個代碼塊(四個領先的空格,而不是back-ticks)中,因爲它不太可讀。或者將您的解決方案作爲答案發布。另外,libavcodec還具有格式轉換功能。它的實現將利用矢量指令和其他可用的平臺上的其他內容。 –
你是如何轉換成BGRA的?因爲你的line_stride肯定是個問題。 – szatmary
ffmpeg轉換它好嗎? (命令行) – rogerdpack