如何解码yuv444p帧编码的h264视频?

时间:2015-10-21 05:09:44

标签: video ffmpeg decode h.264 yuv

我有一个从yuv444p帧编码的h264视频流,它使用vlc或mpv播放器播放得很好。

但是当我尝试使用libavcodec对其进行解码时,它看起来就像这样。

wrong result;

源框架是一个升级的vlc-player徽标。

以下是解码器的初始化:

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

解码从yuv420p编码的数据包时解码器运行良好。 在解码从yuv444p帧编码的数据包时,我错过了什么吗?

更新:我使用sws_scale()将yuv444p输出转换为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);

然后图片看起来没事。

9中有一个i + width + 9。我猜想因为我知道源图片的宽度和高度。但是,如果将宽度或高度更改为其他值,9无法正常工作。

我想知道解码器有什么问题。

1 个答案:

答案 0 :(得分:1)

视频采用什么像素格式?如果使用ffmpeg编码,除非你告诉它,否则它不会将色度降低到yuv420。默认情况下,它将生成一个yuv444 h.264流,libavcodec将解码为yuv444帧。如果您将这些字节解释为yuv420,则它看起来不正确。从形象来看,这可能就是发生了什么。

如果您正在解码RGB h.264流,

libavcodec甚至可以为您提供平面RGB(gbrp)输出。

因此,您必须检查从解码器获得的像素格式,并相应地对其进行处理。