在FFMPEG软件中,AVPicture用于存储图像数据,使用数据指针和linesizes。意思是所有的字幕都以图片的形式存储在ffmpeg内部。现在我有 DVB 字幕,我想将存储在 AVPicture 中的字幕图片转储到缓冲区中。我知道可以使用 for、fopen 和 sprintf 转储这些图像字幕。但不知道如何转储字幕。我必须以 .ppm 文件格式转储字幕。
谁能帮我从 AVSubtitle 转储缓冲区中的字幕图片。
最佳答案
这个过程看起来很复杂,但实际上非常简单。AVSubtitle
是通用格式,支持文本和位图模式。仅 Dvbsub 格式 afaik 位图,位图格式可以不同,如 16color 或 256color 模式,称为 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 本身(颜色表)将在 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 使用的图片帧数据是 liner 并且每个像素是 1 个字节(即使在 16color 模式下)。这个字节值实际上是对应于存储在颜色查找表 (CLUT) 中的 RGB (?) 值的索引值,在 16 色模式下,每 4 个字节有 16 个索引,前 3 个是 R、G、B 值,第 4 个是alpha(透明度值,如果 PPM 不支持,请忽略它)。
我不确定解码的字幕是否仍然具有编码的 YUV 值。我记得它应该是纯 RGBA 格式。
encode_dvb_subtitles ffmpeg 上的函数显示了这种编码是如何完成的。如果你需要它。
https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavcodec/dvbsub.c
希望有帮助。
关于audio - 从文件中的 AVSubtitle 转储字幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54125207/