C 如何从AV_PIX_FMT_BGRA转换为PIX_FMT_PAL8?

C 如何从AV_PIX_FMT_BGRA转换为PIX_FMT_PAL8?,c,ffmpeg,C,Ffmpeg,我很难将图像从AV\u PIX\u FMT\u BGRA转换为PIX\u FMT\u PAL8。不幸的是,sws\u getCachedContext不支持到PIX\u FMT\u PAL8的转换 我想做的是将我的图像转换成GIF视频,输出质量更高。看来,PIX\u FMT\u PAL8有可能提供我想要的更高质量的输出 据我所知,我需要对像素数据进行调色板处理,但我不知道该怎么做 当像素格式为调色板化RGB(PIX\u FMT\u PAL8)时,调色板化 图像数据存储在AVFrame.data[

我很难将图像从
AV\u PIX\u FMT\u BGRA
转换为
PIX\u FMT\u PAL8
。不幸的是,
sws\u getCachedContext
不支持到
PIX\u FMT\u PAL8
的转换

我想做的是将我的图像转换成GIF视频,输出质量更高。看来,
PIX\u FMT\u PAL8
有可能提供我想要的更高质量的输出

据我所知,我需要对像素数据进行调色板处理,但我不知道该怎么做

当像素格式为调色板化RGB(
PIX\u FMT\u PAL8
)时,调色板化 图像数据存储在
AVFrame.data[0]
中。调色板被传送到
AVFrame.data[1]
长度为1024字节(256个4字节条目),并且 格式与上述PIX_FMT_RGB32中的格式相同(即 也可以是特定于endian的)。还请注意,单个RGB调色板 存储在
AVFrame.data[1]
中的组件应在0..255范围内。 这与设计的许多定制PAL8视频编解码器一样重要 要在IBM VGA图形适配器上运行,请使用6位调色板组件


任何帮助或指导都将不胜感激。

下面的代码是根据我自己导出的ARGB/RGB(A)代码改编的。我还没有测试过,但是主要的想法应该足够清楚

下面的代码被修改以使颜色转换更具可读性,可能有一种更快的方法来实现这一点

uint32_t* pal8_to_bgra(AVPicture* pict, int width, int height)
{
    size_t size = width * height * 4; /* times 4 because 4 bytes per pixel */
    uint32_t colours[255];
    uint32_t *buff = NULL;

    buff = malloc(size);
    if (buff == NULL) {
        fprintf(stderr,
                "Error allocating memory for subtitle bitmap.\n");
        return NULL;
    }

    for (int i = 0; i < 256; ++i) {
        /* Colour conversion. */
        int idx = i * 4; /* again, 4 bytes per pixel */
        uint8_t r = pict->data[1][idx],
                g = pict->data[1][idx + 1],
                b = pict->data[1][idx + 2],
                a = pict->data[1][idx + 3];
        colours[i] = (b << 24) | (g << 16) | (r << 8) | a;
    }

    for (int y = 0; y < rect->h; ++y) {
        for (int x = 0; x < rect->w; ++x) {
            /* 1 byte per pixel */
            int coordinate = x + y * pict->linesize[0];
            /* 32bpp color table */
            int idx = pict->data[0][coordinate];
            buff[x + (y * rect->w)] = colours[idx];
        }
    }

    return buff;
}
uint32\u t*pal8\u to\u bgra(AVPicture*pict,int-width,int-height)
{
size\u t size=width*height*4;/*乘以4,因为每像素4字节*/
uint32_t颜色[255];
uint32_t*buff=NULL;
buff=malloc(大小);
如果(buff==NULL){
fprintf(标准,
“为字幕位图分配内存时出错。\n”);
返回NULL;
}
对于(int i=0;i<256;++i){
/*颜色转换*/
int idx=i*4;/*同样,每像素4字节*/
uint8\u t r=pict->data[1][idx],
g=pict->data[1][idx+1],
b=pict->data[1][idx+2],
a=pict->data[1][idx+3];
颜色[i]=(b线宽[0];
/*32bpp颜色表*/
int idx=pict->数据[0][坐标];
buff[x+(y*rect->w)]=颜色[idx];
}
}
返回buff;
}

您是在尝试编写代码来执行转换?还是在尝试找到正确的FFmpeg命令来执行转换?我正在尝试编写代码来执行此操作。实际上,我已经编写好了代码,但我一直在努力提高GIF输出质量。我想我对整个托盘交易有了更好的理解,但我不确定FFmpeg是否会合作n根据给定的图像导入一些内容以生成最适合的托盘。我觉得这样可以获得更高质量的GIF。我不确定是否有其他方法可以获得更好的GIF质量,或者是否可能。您的代码片段提供了PAL8->RGBA转换。请求的RGBA->PAL8没有那么简单