我正在解码H.265原始数据:
self.validates
通话结束后, avcodec_decode_video2(decoderCtx, pictYUV, &gotPicture, &packet)
的值为AV_PIX_FMT_YUV420P。
我将原始yuv值转储到文件中,如下所示:
pictYUV->format
对于640x480的输入尺寸,当查看文件时(使用ImageMagick显示实用程序),图像是预期的。
但是,对于864x480的输入尺寸,图像似乎已损坏。
有趣的是,如果我通过sws_scale运行pictYUV,并转储生成的yuv输出,图像看起来很好。
fwrite(pictYUV->data[0], 1, w*h, f);
fwrite(pictYUV->data[2], 1, w*h/4, f);
fwrite(pictYUV->data[1], 1, w*h/4, f);
我所需要的只是yuv数据。我希望我可以避免额外调用sws_scale。想知道我错过了什么。问候。
答案 0 :(得分:2)
我将原始yuv值转储到文件中,如下所示:
fwrite(pictYUV->data[0], 1, w*h, f); fwrite(pictYUV->data[2], 1, w*h/4, f); fwrite(pictYUV->data[1], 1, w*h/4, f);
填充行,写入每行(大小为w
表示亮度或w/2
表示色度),然后将数据指针递增data->linesize[n]
,其中n
为飞机指数:
static void writePlane(FILE *f, uint8_t *data, ptrdiff_t linesize,
int w, int h)
{
for (int y = 0; y < h; y++) {
fwrite(data, 1, w, f);
data += linesize;
}
}
然后使用以下方法编写飞机:
writePlane(f, pictYUV->data[0], pictYUV->linesize[0], w, h);
writePlane(f, pictYUV->data[1], pictYUV->linesize[1], w / 2, h / 2);
writePlane(f, pictYUV->data[2], pictYUV->linesize[2], w / 2, h / 2);