Video 如何解码yuv444p帧编码的h264视频?
我有一个从yuv444p帧编码的h264视频流,它使用vlc或mpv播放器播放得很好 但当我试图用libavcodec解码它时,它看起来就像这样 ) 源帧是一个放大的vlc播放器徽标 以下是解码器的初始化:Video 如何解码yuv444p帧编码的h264视频?,video,ffmpeg,decode,h.264,yuv,Video,Ffmpeg,Decode,H.264,Yuv,我有一个从yuv444p帧编码的h264视频流,它使用vlc或mpv播放器播放得很好 但当我试图用libavcodec解码它时,它看起来就像这样 ) 源帧是一个放大的vlc播放器徽标 以下是解码器的初始化: AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264); AVCodecContext *codecCtx = avcodec_alloc_context3(codec); avcodec_open2(codecCtx, codec,
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);
int offset\u out=0,offset\u tmp=0;
uint32_t*tmp=(uint32_t*)malloc(宽*高*4);
对于(inti=0;i宽度){
out[offset_out++]=in[i];
}否则{
tmp[offsetu tmp++]=in[i];
}
}
memcpy(out+offset\u out,tmp,offset\u tmp);
免费(tmp);
然后这幅画看起来很好
在i+width+9
中有一个数字9
。我猜是因为我知道源图片的宽度和高度。但是,如果宽度或高度被更改为其他值,9
不起作用
我想知道解码器有什么问题。视频有什么像素格式?如果使用ffmpeg编码,除非您告诉它,否则它不会将色度降低到yuv420。默认情况下,它将生成yuv444 h.264流,libavcodec将该流解码为yuv444帧。如果您将这些字节解释为yuv420,它看起来将不正确。从图像上看,可能就是这样 如果您正在解码RGB h.264流,libavcodec甚至可以为您提供平面RGB(
gbrp
)输出
因此,您必须检查从解码器获得的像素格式,并进行相应处理。编辑您的问题,并将其放入代码块(四个前导空格,而不是反勾号),因为它不太可读。或者将您的解决方案作为答案发布。此外,libavcodec还具有格式转换功能。它的实现将利用向量指令和其他类似的东西,在它们可用的平台上。你是如何转换成BGRA的?因为这肯定是一个问题,你的线路_stride.ffmpeg转换它好吗?(命令行)H264-->解码-->YUV444P-->转换-->BGRA;解码中存在问题。转换是可以的。