ffmpeg YUV420到RGB24只能转换一行

时间:2016-08-10 09:53:42

标签: c++ bitmap ffmpeg swscale

我试图在c ++中将YUV420p图像转换为RGB24,并在c#中从字节数组创建位图。

我的图像大小为1920 w * 1020 h,ffmpeg解码器为我提供了3个lineizes = {1920,960,960}的数据平面。但是在sws_scale之后,我只得到一个平面尺寸为5760的RGB平面图片。 它看起来不正确:我应该得到(5760 * h),而不仅仅是一行数据。我做错了什么?

 //c++ part
    if (avcodec_receive_frame(m_decoderContext, pFrame) == 0)
    {
        //RGB
        sws_ctx = sws_getContext(m_decoderContext->width,
            m_decoderContext->height,
            m_decoderContext->pix_fmt,
            m_decoderContext->width,
            m_decoderContext->height,
            AV_PIX_FMT_RGB24,
            SWS_BILINEAR,
            NULL,
            NULL,
            NULL
        );

        sws_scale(sws_ctx, (uint8_t const * const *)pFrame->data, pFrame->linesize,
            0, pFrame->height,
            pFrameRGB->data, pFrameRGB->linesize);


//c# part (im reading data from pipe and its equal to c++ part)------------------------------------------------------------------
        byte[] rgbch = new byte[frameLen];
        for (int i=0; i<frameLen; i++)
        {
            rgbch[i] = Convert.ToByte(pipe.ReadByte());
        }

        if (rgbch.Length > 0)
        {
            var arrayHandle = System.Runtime.InteropServices.GCHandle.Alloc(rgbch,
    System.Runtime.InteropServices.GCHandleType.Pinned);

            var bmp = new Bitmap(1920, 1080,
                3,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb,
                arrayHandle.AddrOfPinnedObject()
            );

            pictureBox1.Image = bmp;
        }

1 个答案:

答案 0 :(得分:1)

您假设AVFramelinesize字段是数据总量不正确。作为变量的名称,它表示单行的长度,而sws_scale的返回值为您提供行数。因此,输出位图的总内存范围大小为linesize乘以返回值。