audio - 从文件中的 AVSubtitle 转储字幕

标签 audio ffmpeg subtitle

在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/

相关文章:

ffmpeg - gdb 不会停在即使是微不足道的断点

audio - .MKV 到 .MP4 选择音频和字幕?

javascript - 当包含字幕轨道时,在 Chrome 27.x 中加载视频但不使用 mediaelement.js 播放

ffmpeg - 如何使用 mencoder/ffmpeg 命令行工具更改字幕的颜色并为其添加背景?

arrays - 点击 CollectionView Cell 按钮可播放特定阵列中的声音并从特定阵列中复制电影

video - MP4 moof 片段 header

javascript - Android WebView 使用 javascript 播放音频

JavaScript - 生成 .SRT 文件

jquery - 如何在HTML 5中为音频,视频,CSS,图像创建预加载器?

python - 如何使用Python在一个USB设备上播放音频并在另一个USB设备上同时记录音频?