Linux: реализовать Encoder (libav) на C++
35 000 руб. за проект
Хочу реализовать обертку для 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
у меня 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
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.