Правильный способ работы с необработанными данными при кодировании с использованием FFmpeg - PullRequest
0 голосов
/ 18 марта 2020

Я работаю над библиотекой 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 для обработки байтовых массивов?

1 Ответ

1 голос
/ 18 марта 2020

Должен ли я использовать AVIOContext для обработки байтовых массивов?

Нет. AVIOContext если для работы с файлами и / или контейнерами в памяти. В этом случае avformat требуется для чтения закодированных кадров из массива байтов. Вы работаете с необработанными кадрами напрямую и вам не нужно использовать avformat.

...