1. Первый метод заключается в том, что вы можете использовать libyuv
.
2.Вы также можете использовать sws_getCachedContext
и sws_scale
две функции в libswscale.a
модуле ffmpeg
, например такпреобразовать AV_PIX_FMT_YUV420P
в AV_PIX_FMT_0BGR32
:
enum AVPixelFormat dst_format = AV_PIX_FMT_0BGR32;
if (!is->img_convert_ctx)
is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx, sourceFrame->width, sourceFrame->height, sourceFrame->format, sourceFrame->width, sourceFrame->height, dst_format, SWS_BILINEAR, NULL, NULL, NULL);
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS];
av_image_alloc(data, linesize, sourceFrame->width, sourceFrame->height, dst_format, 1);
AVFrame *tempFrame = sourceFrame;
sws_scale(is->img_convert_ctx, (const uint8_t**) tempFrame->data, sourceFrame->linesize, 0, sourceFrame->height, data, linesize);
free(data[0]);
после этого , AV_PIX_FMT_0BGR32
данные находятся в data[0]
и linesize[0]