ffmpeg YUV420 到 RGB24 只转换一行
ffmpeg YUV420 to RGB24 converts only one row
我正在尝试在 C++ 中将我的 YUV420p 图像转换为 RGB24,并在 C# 中从字节数组创建位图。
我的图像尺寸为 1920 w * 1020 h,ffmpeg 解码器为我提供了 3 个平面数据,其线宽 = {1920, 960, 960}。但是在 sws_scale 之后,我得到的 RGB 图片只有一个平面,linesize = 5760。
它看起来不正确:我应该得到 (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;
}
您假设 AVFrame 的 linesize
字段是数据总量是不正确的。正如变量的名称所述,它是单行的长度,而 sws_scale
的 return 值给出了行数。因此,输出位图的总内存范围大小是 linesize
乘以 return 值。
我正在尝试在 C++ 中将我的 YUV420p 图像转换为 RGB24,并在 C# 中从字节数组创建位图。
我的图像尺寸为 1920 w * 1020 h,ffmpeg 解码器为我提供了 3 个平面数据,其线宽 = {1920, 960, 960}。但是在 sws_scale 之后,我得到的 RGB 图片只有一个平面,linesize = 5760。 它看起来不正确:我应该得到 (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;
}
您假设 AVFrame 的 linesize
字段是数据总量是不正确的。正如变量的名称所述,它是单行的长度,而 sws_scale
的 return 值给出了行数。因此,输出位图的总内存范围大小是 linesize
乘以 return 值。