2014-06-19 48 views
2

我很難將我的圖像從AV_PIX_FMT_BGRA轉換爲PIX_FMT_PAL8。不幸的是sws_getCachedContext不支持轉換爲PIX_FMT_PAL8如何轉換AV_PIX_FMT_BGRA至PIX_FMT_PAL8?

我想要做的是將我的圖像轉換爲GIF視頻,輸出質量更高。看來PIX_FMT_PAL8可能會提供更高質量的輸出,我正在尋找。

根據this documentation我需要palettize像素數據,但我不知道如何做到這一點。

當像素格式爲調色RGB(PIX_FMT_PAL8)時,調色 圖像數據被存儲在AVFrame.data[0]。調色板在 AVFrame.data[1]中傳輸,長1024字節(256個4字節條目),並且其格式與上述PIX_FMT_RGB32中的相同(即,它也是 也是端序特定的)。還請注意,存儲在AVFrame.data[1]中的各個RGB調色板 組件的範圍應在0到255之間。 這很重要,因爲許多設計爲 的定製PAL8視頻編解碼器在IBM VGA圖形適配器上運行時使用6位調色板組件。

任何幫助或方向將不勝感激。

+0

您是否試圖編寫代碼來執行轉換?或者你是否試圖找到正確的FFmpeg命令來做到這一點? –

+0

我正在嘗試編寫代碼來執行此操作。實際上我的代碼工作正常,除了我正在努力提高GIF輸出質量。我想我對整個托盤交易有了更好的理解,但我不確定ffmpeg是否包含根據給定圖像生成最合適托盤的東西。我覺得這樣我可以得到更好的質量的GIF。我不確定其他方法可以達到更好的GIF質量,或者甚至可能。 – Jona

回答

0

下面的代碼是根據我自己的導出到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; 
}