在FFMPEG软件中,AVPicture用于通过数据指针和行大小存储图像数据,这意味着所有字幕都以图片形式存储在ffmpeg中。现在我有了DVB字幕,我想将存储在AVPicture中的字幕图片转储到缓冲区中。我知道可以使用for,fopen和sprintf转储这些图像字幕。但是不知道如何转储字幕。我必须转储.ppm文件格式的字幕。
谁能帮我从AVSubtitle转储字幕图片?
答案 0 :(得分:0)
此过程看起来很复杂,但实际上非常简单。
AVSubtitle
是通用格式,支持文本和位图模式。仅dvbsub格式afaik位图,并且位图格式可以不同,例如称为CLUT_DEPTH
的16色或256色模式。
我相信(在当前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)可以从pkt->rects[0]->nb_colors
中读取CLUT_DEPTH。
5)CLUT本身(颜色表)将位于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
数据包中获得的数据构造一个标头。并为dvbsub的索引颜色缓冲区编写一个转换函数为RGB。我很确定某个地方有一些随时可以使用的代码,但是我还是会解释。
在图像数据中,Dvbsub使用的是线性数据,每个像素为1字节(即使在16色模式下)。此字节值实际上是与存储在颜色查找表(CLUT)中的RGB(?)值相对应的索引值,在16色模式下,每个16个索引中的每个4个字节,前3个是R,G,B值,第4个是alpha(透明度值,如果PPM不支持此值,则将其忽略)。
我不确定解码字幕是否仍具有已编码的YUV值。我记得它应该是纯RGBA格式。
ffmpeg上的 encode_dvb_subtitles 函数显示了此编码的完成方式。如果需要的话。
https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavcodec/dvbsub.c
希望有帮助。