从文件中的 AVSubtitle 转储字幕

Dump subtitle from AVSubtitle in the file

在FFMPEG软件中,AVPicture使用数据指针来存储图像数据,linesizes.It表示所有字幕都以图片的形式存储在ffmpeg中。现在我有了 DVB 字幕,我想将存储在 AVPicture 中的字幕图片转储到缓冲区中。我知道这些图像字幕可以使用 for、fopen 和 sprintf 转储。但是不知道如何转储Subtitle.I只好转储.ppm文件格式的字幕

谁能帮我从 AVSubtitle 转储缓冲区中的字幕图片。

这个过程看似复杂,其实很简单。
AVSubtitle 为通用格式,支持文本和位图模式。仅 Dvbsub 格式 afaik 位图,位图格式可以不同,如 16 色或 256 色模式,称为 CLUT_DEPTH
我相信(在当前的 ffmpeg 中)位图存储在 AVSubtitleRect 结构中,它是 AVSubtitle.
的成员 我假设你有一个有效的 AVSubtitle 数据包,如果我理解正确的话你可以做这些并且它应该工作:
1) 检查 pkt->rect[0]->type。这里的 pkt 是一个有效的 AVSubtitle 数据包。必须是 SUBTITLE_BITMAP.
类型 2) 如果是这样,可以从 pkt->rects[0]->wpkt->rects[0]->h.
中读取带有和高度的位图 3) 位图数据本身将是 pkt->rects[0]->data[0].
4) CLUT_DEPTH 可以从 pkt->rects[0]->nb_colors.
读出 5) CLUT 本身(颜色 table)将在 pkt->rects[0]->data[1] 中。

使用这些数据,您可以构建一个有效的 .bmp 文件,可以在 windows 或 linux 桌面上查看,但我将这部分留给了您。

PPM 信息

首先查看有关 PPM 格式的信息:
https://www.cs.swarthmore.edu/~soni/cs35/f13/Labs/extras/01/ppm_info.html

据我了解,PPM 格式使用 RGB 值(24 位/3 字节)。在我看来,你所要做的就是根据从上面的 AVSubtitle 数据包中获得的数据构造一个 header 。并为dvbsub 的索引颜色缓冲区编写一个到RGB 的转换函数。我很确定某处有一些准备好使用的代码,但我还是会解释一下。
在Dvbsub使用的图片帧数据是线性的,每个像素是1个字节(即使在16色模式下)。这个字节值实际上是ColorLook-UpTable(CLUT)中存储的对应RGB(?)值的索引值,在16色模式下每4个字节有16个索引,前3个是R,G, B 值,第 4 个是 alpha(透明度值,如果 PPM 不支持,请忽略它)。

我不确定解码后的字幕是否还有编码后的 YUV 值。我记得应该是纯RGBA格式。

ffmpeg 上的

encode_dvb_subtitles 函数显示了这种编码是如何完成的。如果你需要的话。
https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavcodec/dvbsub.c

希望对您有所帮助。