问题
In FFMPEG sofftware, AVPicture is used to store image data using data pointer and linesizes.It means all subtitles are stored in the form of picture inside ffmpeg. Now I have DVB subtitle and I want to dump picture of subtitles stored in AVPicture in a buffer. I know these images subtitles can be dump using for, fopen and sprintf. But do not know how to dump Subtitle.I have to dump subtitles in .ppm file format.
Can anyone help me to dump picture of subtitles in buffer from AVSubtitle .
回答1:
This process looks complex but actually very simple.AVSubtitle
is generic format, supports text and bitmap modes. Dvbsub format afaik bitmap only and the bitmap format can be differ like 16color or 256color mode as called CLUT_DEPTH
.
I believe (in current ffmpeg) the bitmaps stored in AVSubtitleRect
structure, which is member of AVSubtitle
.
I assume you have a valid AVSubtitle
packet(s) and if I understand correctly you can do these and it should work:
1) Check pkt->rect[0]->type
. The pkt here is a valid AVSubtitle
packet. It must be type of SUBTITLE_BITMAP
.
2) If so, bitmap with and height can be read from pkt->rects[0]->w
and pkt->rects[0]->h
.
3) Bitmap data itself in will be pkt->rects[0]->data[0]
.
4) CLUT_DEPTH can be read from pkt->rects[0]->nb_colors
.
5) And CLUT itself (color table) will be in pkt->rects[0]->data[1]
.
With these data, you can construct a valid .bmp
file that can be viewable on windows or linux desktop, but I left this part to you.
PPM Info
First check this info about PPM format:
https://www.cs.swarthmore.edu/~soni/cs35/f13/Labs/extras/01/ppm_info.html
What I understand is PPM format uses RGB values (24bit/3bytes). It looks like to me all you have to do is construct a header according to data obtained from AVSubtitle
packet above. And write a conversion function for dvbsub's indexed color buffer to RGB. I'm pretty sure somewhere there are some ready to use codes out there but I'll explain anyway.
In the picture frame data Dvbsub uses is liner and every pixel is 1 byte (even in 16color mode). This byte value is actually index value that correspond RGB (?) values stored in Color Look-Up Table (CLUT), in 16 color mode there are 16 index each 4 bytes, first 3 are R, G, B values and 4th one is alpha (transparency values, if PPM doesn't support this, ignore it).
I'm not sure if decoded subtitle still has encoded YUV values. I remember it should be plain RGBA format.
encode_dvb_subtitles function on ffmpeg shows how this encoding done. If you need it.
https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavcodec/dvbsub.c
Hope that helps.
来源:https://stackoverflow.com/questions/54125207/dump-subtitle-from-avsubtitle-in-the-file