Этот процесс выглядит сложным, но на самом деле очень простым.
AVSubtitle
- общий формат, поддерживает текстовый и растровый режимы. Формат Dvbsub только для растрового изображения aaik, и формат растрового изображения может отличаться как 16-цветный или 256-цветный режим, называемый CLUT_DEPTH
.
Я считаю (в текущем ffmpeg) растровые изображения хранятся в структуре AVSubtitleRect
, которая является членом AVSubtitle
.
Я предполагаю, что у вас есть действительный пакет AVSubtitle
, и если я правильно понимаю, вы можете сделать это, и он должен работать:
1) Проверьте pkt->rect[0]->type
. Здесь pkt является действительным AVSubtitle
пакетом. Это должен быть тип SUBTITLE_BITMAP
.
2) Если это так, растровое изображение с и height можно прочитать из 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 Info
Сначала проверьте информацию о формате 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-цветном режиме). Это байтовое значение фактически является индексным значением, которое соответствует значениям RGB (?), Хранящимся в таблице соответствия цветов (CLUT), в 16-цветном режиме 16 индексов имеют каждые 4 байта, первые 3 - значения R, G, B и 4-й - альфа (значения прозрачности, если PPM не поддерживает это, игнорируйте).
Я не уверен, что декодированные субтитры все еще имеют закодированные значения YUV. Я помню, это должен быть простой формат RGBA.
encode_dvb_subtitles * Функция 1042 * в ffmpeg показывает, как выполняется эта кодировка. Если вам это нужно.
https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavcodec/dvbsub.c
Надеюсь, это поможет.