c - AVSubtitleRect DVBSub格式解释

标签 c ffmpeg bitmap subtitle

我正在尝试将 AVSubtitle 中的 DVBSub 数据转换为 RGB 格式,但它似乎不起作用。我只是得到随机的颜色。

这是代码:

/* rects comes from AVSubtitleRect type elsewhere*/

int bw = rects[0].w;
int bh = rects[0].h;
uint32_t colour;
uint32_t *bitmap;
int r, g, b;

/* Give it some memory */
bitmap = malloc(bw * bh * sizeof(uint32_t));

for (int y = 0; y < bh; y++) 
   {
        for (int x = 0; x < bw; x++) 
        {
            /* data[0] holds index data */
            const uint8_t index = rects[0]->data[0][y * bw + x]; 

            /* data[1] holds colours - get colour from index */
            colour = rects[0]->data[1][4 * index];

            r = (colour >> 16) & 0xFF;
            g = (colour >>  8) & 0xFF;
            b = (colour >>  0) & 0xFF;

            /* construct bitmap pixel by pixel (24 bit RGB) */
            bitmap[y * bw + x] = r << 16 | g << 8 | b;
        }
    }

这里有一些信息Dump subtitle from AVSubtitle in the file但我不确定我是否正确理解它。

我确信我得到了正确的数据并且基于文本的字幕看起来很好。不太确定我在这里做错了什么。

最佳答案

DVBSub 矩形使用索引颜色位图。每个像素使用 2、16 或 256 种颜色。
话虽如此,这些矩形几乎总是使用 16(4 位)索引颜色格式。
然而,单个像素需要整个 8 位(4 位 + 4 位零)。
CLUT(颜色查找表)使用完整的 32 位 ARGB 格式(是的,使用 Alpha channel 实现透明度)。所以对于 16 色格式,CLUT 大小为 64 字节(16*4)。

希望这些有所帮助。

关于c - AVSubtitleRect DVBSub格式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551861/

相关文章:

android - 如何设置绘制的位图宽度和高度

c - 如何横向字符串的数字,然后分配给变量

c++ - 将 hls 直播转换为 rtmp

audio - 使用 ffmpeg 将 RTSP + 音频发送到 RTMP 服务器

安卓:bitmapfactory.decodestream 返回 null

c# - 保存位图时发生 GDI+ 异常中的一般错误

c - C 预处理器是先去除注释还是先展开宏?

java - Java和C之间的浮点类型有什么区别吗?

C - 为什么我不能映射较小(256UL 或更小)的内存?

ffmpeg - 如何连接和输出各种视频比特率和独立的音频文件?