2015-10-21 125 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。 –