gpt4 book ai didi

ffmpeg - 在 avcodec_decode_video2 之后转储 yuv 值的正确方法

转载 作者:行者123 更新时间:2023-12-04 22:55:44 25 4
gpt4 key购买 nike

我正在解码 H.265 原始数据:

 avcodec_decode_video2(decoderCtx, pictYUV, &gotPicture, &packet)

调用后, pictYUV->format 的值正如预期的那样,是 AV_PIX_FMT_YUV420P。

我将原始 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);

对于 640x480 的输入大小,当查看文件时(使用 ImageMagick 显示实用程序),图像是预期的。

但是,对于 864x480 的输入尺寸,图像似乎已损坏。

有趣的是,如果我通过 sws_scale 运行 pictYUV,并转储生成的 yuv 输出,图像看起来很好。
sws_scale(swsCtx, pictYUV->data, pictYUV->linesize, 0, pictYUV->height,
pictNewYUV->data, pictNewYUV->linesize);

我只需要 yuv 数据。我希望我可以避免对 sws_scale 的额外调用。想知道我错过了什么。问候。

最佳答案

I dump raw yuv values to a file as follows:

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);

关于ffmpeg - 在 avcodec_decode_video2 之后转储 yuv 值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44785801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com