从文件中的 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]->w
和 pkt->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
希望对您有所帮助。
在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]->w
和 pkt->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
希望对您有所帮助。