Linux: реализовать Encoder (libav) на C++

35 000 руб. за проект
06 августа 2019, 20:35 • 7 откликов • 84 просмотра
Хочу реализовать обертку для libav,

у меня ubuntu 16.04, все библиотеки из пакетов стандартного репозитория

- на входе у меня всегда ЧБ изображения (1 байт на пиксель) в GRAY8

- на выходе хочу получать сжатый в H264 поток в каком-нибудь контейнере MP4, MKV

- таких объектов в работе может быть несколько, т.е. каждый из них работает независимо друг от друга

- я хочу иметь возможность задавать выходной битрейт и размеры кадра

- иметь возможность задавать частоту кадров

class SoftwareVideoEncoder {

// запрет копирования и присваивания и т.д.

private:
size_t m_size;
char * m_data;

// внутренний буфер
// при старте сразу выделетяется 4 МБ
// далее увеличивается например по такому принципу: +4MB через realloc

public:

SoftwareVideoEncoder(); // конструктор, может быть с какими-то параметрами - обсуждаемо
~SoftwareVideoEncoder();

// указатель на внутренний буфер и его размер
// в него помещаются готовые сжатые данные
const char * data() const;
size_t size() const;

void clear(); // сбрасывает буфер, size становится равен 0, размер (если он разросся сокращается до дефолтного)
// после этого считается, что данных в буфере нет и очередные кадры пишутся в 0 позицию

int debug = 0; // выводить или нет отладочную информацию, смотри сам если нужно

int isKeyFrame = 0;

// если последний кадр который был только что сгенерирован оказался ключевым, то выставляется в 1
// в противном случае 0

void geometry(ifmt, ofmt, iw, ih, w, h, ...); // пусть все будет int
// это такая своего рода переинициализация энкодера, после нее автоматом вызывается clear();

void bitrate(int); // установка bitrate в kbps
void setSomething(); // что-то еще

// добавить один кадр, для кодирования
int encode (const char * data, size_t size);

// что может возвращать? может какую-то ошибку?
// если ничего (а скорее всего так), то можно сделать и void
// все-таки предполагается, что на входе валидные данные
// хотя можно проверить равен ли size (параметр функции) iw * ih * bpp;

// кадр сжимается, закидывается во внутренний буфер
// пользовтель забирает либо все разом, либо хоть каждый раз по одной частичке

// ifmt, ofmt - входные и выходные форматы, что тут может быть?
// можно их опустить вообще,
// ведь у нас на входе всегда GRAY8, а на выходе...
// мы получаем "цветную картинку", т.е. всякие там YUV420M, которая выглядит как чернобелая
// просто она будет выглядеть как ч/б но по факту она цветная
// так будет больше совместимости с разными плеерами я думаю
};

понятно, что это всего-лишь черновик и его необходимо дополнить

возможные выходные форматы (ofmt):

H264_RAW кадр за кадром пишется во внутренний буфер
H264_MP4
H264_MKV