Как создать функцию для FFmpeg lib для кодирования кадра в любой (возможный) формат? - PullRequest
1 голос
/ 08 июля 2010

Итак, как создать что-то, что будет иметь что-то вроде этого в API:

Encoder = EncoderFormat(format name); // prepare encoder
//...code for frames generation... now we want to encode frame!//
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, more args if needed);

Возможно ли это?Кто-нибудь может привести простой пример того, как создать такую ​​вещь?

1 Ответ

1 голос
/ 08 июля 2010

Это невозможно без использования крайне плохих методов программирования, таких как глобальные переменные.Кодирование кадров не является независимым;кодировщик должен сохранять состояние (контекст), для которого вы должны сохранять указатель для передачи в функцию кодировщика каждый раз.Идея передачи выбора формата в EncodeFrame также довольно глупа, поскольку вы не можете выбрать формат для кадра, не закрывая существующий контекст кодера и не переключаясь на новый.

Если исходное изображение уже не являетсяв формате, который хочет кодировщик (вероятно, YUV 4: 2: 0), ваша оболочка должна будет преобразовать его.Это можно сделать самостоятельно или с помощью libswscale из ffmpeg.Вы также должны указать временную метку для каждого кадра.Если вам нужен простой API, в котором вам не нужно беспокоиться об этом, вы, вероятно, захотите обернуть указатель контекста av-кодека, который libavcodec предоставляет вам в другой структуре, где вы сохраняете значение рабочей метки времени, указатель контекста swscale и т. Д.*

Кроме того, ваш API не может указать размер буфера назначения, поэтому он совершенно небезопасен.Может быть лучше вернуть указатель на внутренний буфер (через возвращаемое значение или аргумент указатель-на-указатель) вместе с размером закодированного кадра, вместо записи в буфер вызывающего.

...