【发布时间】:2022-01-11 18:48:23
【问题描述】:
我必须从 cairo 表面像素数据中填充 ffmpeg AVFrame->数据。我有这个代码:
/* Image info and pixel data */
width = cairo_image_surface_get_width( surface );
height = cairo_image_surface_get_height( surface );
stride = cairo_image_surface_get_stride( surface );
pix = cairo_image_surface_get_data( surface );
for( row = 0; row < height; row++ )
{
data = pix + row * stride;
for( col = 0; col < width; col++ )
{
img->video_frame->data[0][row * img->video_frame->linesize[0] + col] = data[0];
img->video_frame->data[1][row * img->video_frame->linesize[1] + col] = data[1];
//img->video_frame->data[2][row * img->video_frame->linesize[2] + col] = data[2];
data += 4;
}
img->video_frame->pts++;
}
但是导出的视频中的颜色是错误的。原来的心是红色的。有人可以指出我正确的方向吗?遗憾的是,encode.c 示例毫无用处,并且在 Internet 上存在很多关于 Y、Cr 和 Cb 的混淆,我真的不明白。请随时询问更多详情。非常感谢。
【问题讨论】:
-
能否请您发布一个完整的代码示例 - 我们可以编译和执行的东西?您可能需要有创意 - 考虑将 8x8 输入图像发布为 C 数组(由代码初始化)。你能描述一下
pix的数据排列吗(是width、height和stride的行主要RGBA)吗? YCbCr像素格式在哪一部分使用? -
非常感谢您的回复。我很感激。该代码是 GTK3 GUI 的一部分,它将一系列图片转换为电影。这是我自 2009 年以来一直在开发的项目。遗憾的是,我无法提供代码 sn-p,但该软件是开源的。 cairo 表面为 RGB24。 AV 上下文创建为 AV_PIX_FMT_YUV420P,因为如果我使用 AV_PIX_FMT_RGB24,我会在编码期间收到错误消息:“输入宽度大于步幅”。希望这会有所帮助,请随时询问更多信息。
-
我目前对 YCbCr 的理解是它是由 Luminance/Red-diff/Blue-diff 组成的,其中 Luminance 是亮度,Red-diff 和 Blue-diff 是色度值,带有关于 Red/green 的信息和蓝/绿分别。它通过将黑白图像与两个色度通道相结合来工作
标签: ffmpeg rgb cairo libav libavcodec