我想使用ffmpeg 3.3解码android上的h.264流缓冲区。 我从流中成功获得了 AVFrame 结构,其格式为 AV_PIX_FMT_YUV420P 。要在 android 上显示图片,我需要将其转换为 AV_PIX_FMT_ARGB 或 AV_PIX_FMT_RGB565 。我尝试了很多次,最后我发现我可以将帧转换为 AV_PIX_FMT_NV21 但是使用几乎相同的代码除了一些参数之外无法将其转换为argb或rgb565。这是我的代码看起来像:
//here i got srcFrame from h264 stream, it's format and size was set by decoder correctly
AVFrame *dstFrame = av_frame_alloc();
dstFrame->format = AV_PIX_FMT_ARGB;
dstFrame->width = srcFrame->width;
dstFrame->height = srcFrame->height;
struct SwsContext *swsContext = sws_getContext(srcFrame->width, srcFrame->height, srcFormat,
dstFrame->width, dstFrame->height,
(enum AVPixelFormat) dstFrame->format,
SWS_FAST_BILINEAR, NULL, NULL, NULL);
int dstBufferSize = av_image_get_buffer_size((enum AVPixelFormat) dstFrame->format, ctx->width,
ctx->height, 1);
uint8_t *dstBuffer = (uint8_t *) av_malloc(
sizeof(uint8_t) * dstBufferSize);
av_image_fill_arrays(dstFrame->data, dstFrame->linesize, dstBuffer,
(enum AVPixelFormat) dstFrame->format, dstFrame->width,
dstFrame->height,
1);
sws_scale(swsContext, (const uint8_t *const *) srcFrame->data,
srcFrame->linesize, 0, srcFrame->height,
dstFrame->data, dstFrame->linesize);