Я работаю над библиотекой android для кодирования / декодирования необработанных данных через ffmpeg. Каждый найденный пример использует файлы, он либо читает, либо записывает в файл. Однако я использую необработанный байтовый массив, представляющий изображение RGBA для ввода кодера, и байтовый массив для вывода кодера. Давайте сосредоточимся на части кодирования для этого вопроса.
Моя функция выглядит следующим образом:
int encodeRGBA(uint8_t *image, int imageSize, int presentationTimestamp,
uint8_t *result, int resultSize)
Где image
- байтовый массив, содержащий необработанные данные изображения rgba, imageSize
- длина этого массив, presentationTimestamp
- просто счетчик, используемый AVFrame
для установки pts
, result
- это предварительно выделенный байтовый массив с некоторой определенной длиной (в настоящее время с шириной, соответствующей размеру x, высотой), а resultSize
- длина байтового массива (ширина x высота). Возвращаемое значение int представляет фактически используемую длину предварительно выделенного массива. Я знаю, что это не лучший подход для отправки данных обратно на java, и это тоже часть вопроса. Есть ли лучший способ для возврата результата?
Пример найден здесь для кодирования, непосредственно записывает байтовые данные в frame-> data [0] (другой подход для разных форматов, RGBA или YUV ). Но поиск в Google по запросу «ffmpeg read from memory» приводит к таким примерам, как this , this или this . Все они предлагают использовать AVIOContext
.
Я не понимаю, как использовать AVFormatContext с AVCodecContext для кодирования?
В настоящее время у меня есть кодер, работающий с использованием первого подхода, и я успешно возвращаю результаты, как описано (с предварительно выделенным байтовым массивом). Я хотел бы знать, если это неправильный подход? Должен ли я использовать AVIOContext
для обработки байтовых массивов?