ffmpeg将AVFrame从yuv420p转换为argb

时间:2017-06-06 11:43:33

标签: android ffmpeg

我想使用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);

0 个答案:

没有答案