Дамп субтитров из AVSubtitle в файл - PullRequest
0 голосов
/ 10 января 2019

В программном обеспечении FFMPEG AVPicture используется для хранения данных изображения с использованием указателя данных и размеров линий. Это означает, что все субтитры хранятся в виде изображения внутри ffmpeg. Теперь у меня есть субтитры DVB, и я хочу сбросить изображение субтитров, хранящихся в AVPicture, в буфер. Я знаю, что эти изображения субтитров можно записать с помощью for, fopen и sprintf. Но не знаю, как сделать дамп субтитров. Я должен дамп субтитров в формате файла .ppm.

Может кто-нибудь помочь мне сбросить изображение субтитров в буфер из AVSubtitle.

1 Ответ

0 голосов
/ 11 января 2019

Этот процесс выглядит сложным, но на самом деле очень простым.
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

Надеюсь, это поможет.

...