Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 如何解码yuv444p帧编码的h264视频?_Video_Ffmpeg_Decode_H.264_Yuv - Fatal编程技术网

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

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,

我有一个从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, 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;解码中存在问题。转换是可以的。