我有一个从yuv444p帧编码的h264视频流,它使用vlc或mpv播放器播放得很好。
但是当我尝试使用libavcodec对其进行解码时,它看起来就像这样。
源框架是一个升级的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
无法正常工作。
我想知道解码器有什么问题。
答案 0 :(得分:1)
视频采用什么像素格式?如果使用ffmpeg编码,除非你告诉它,否则它不会将色度降低到yuv420。默认情况下,它将生成一个yuv444 h.264流,libavcodec将解码为yuv444帧。如果您将这些字节解释为yuv420,则它看起来不正确。从形象来看,这可能就是发生了什么。
如果您正在解码RGB h.264流, libavcodec甚至可以为您提供平面RGB(gbrp
)输出。
因此,您必须检查从解码器获得的像素格式,并相应地对其进行处理。