Android Encode h264 с использованием libavcodec для ARGB

У меня есть поток содержимого буфера, который на самом деле содержит ARGB-изображение размером 480x800 [байтовый массив размером 480*800*4]. Я хочу закодировать около 10000 похожих изображений в поток h.264 с заданным fps(12). это показывает, как кодировать изображения в кодированное видео, но требует, чтобы ввод был yuv420.

Теперь у меня есть изображения ARGB, я хочу кодировать в CODEC_ID_H264 Как конвертировать RGB из YUV420p для кодера ffmpeg? показывает, как это сделать для rgb24, но как это сделать для rgb32, что означает данные изображений ARGB

Как я могу использовать libavcodec для этого?

РЕДАКТИРОВАТЬ: я нашел Как конвертировать RGB из YUV420p для кодировщика ffmpeg? Но я не понимаю.

Из 1-й ссылки я узнаю, что структура AVFrame содержит данные [0], данные 1, данные [2], которые заполнены значениями Y, U & V.

Во второй ссылке они показали, как использовать sws_scale для преобразования RGB24 в YUV420 как таковой.

SwsContext * ctx = sws_getContext(imgWidth, imgHeight,
                              AV_PIX_FMT_RGB24, imgWidth, imgHeight,
                              AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane
int inLinesize[1] = { 3*imgWidth }; // RGB stride
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize)

Здесь я предполагаю, что rgb24Data - это буфер, содержащий байты изображения RGB24.

Так, как я использую эту информацию для ARGB, который является 32-битным? Нужно ли мне вручную убирать альфа-канал или что-то другое?

Спасибо

1 ответ

Просто переключите формат пикселя и переход от линии к RGB24 к ARGB

SwsContext * ctx = sws_getContext(imgWidth, imgHeight,
                              AV_PIX_FMT_ARGB, imgWidth, imgHeight,
                              AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane
int inLinesize[1] = { 4*imgWidth }; // RGB stride
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize)
Другие вопросы по тегам