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)