Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将YUV420帧转换为位图_C#_Image_Image Processing_Bitmap - Fatal编程技术网

C# 无法将YUV420帧转换为位图

C# 无法将YUV420帧转换为位图,c#,image,image-processing,bitmap,C#,Image,Image Processing,Bitmap,我正在尝试将YUV420帧转换为位图或图像。我正在使用AVBlocks库从C#中的MP4视频中读取这些帧。因此,在使用AVBlocks类创建输入和输出套接字之后,我使用YUV420颜色格式和未压缩的视频流类型从视频中提取每个帧。我基本上是通过调用Transcoder.Pull(int-outputIndex,MediaSample-outputData)来实现的,然后作为outputData一部分的MediaBuffer将数据放在字节数组中。因此,我尝试将这些字节转换为位图或图像,以便最终在Wi

我正在尝试将YUV420帧转换为位图或图像。我正在使用AVBlocks库从C#中的MP4视频中读取这些帧。因此,在使用AVBlocks类创建输入和输出套接字之后,我使用YUV420颜色格式和未压缩的视频流类型从视频中提取每个帧。我基本上是通过调用
Transcoder.Pull(int-outputIndex,MediaSample-outputData)
来实现的,然后作为outputData一部分的MediaBuffer将数据放在字节数组中。因此,我尝试将这些字节转换为位图或图像,以便最终在Winforms应用程序中将每个帧显示为PictureBox

我所尝试的:

我已经尝试使用MemoryStream,如下所示,但是我得到一个未处理的ArgumentException,表示参数无效。我还尝试使用
ImageConverter()
转换为图像,但得到了相同的异常。然后,我将字节数组从YUV转换为RGB格式,并将更新后的数组作为参数提供给MemoryStream,但同样没有成功。我还尝试将输出套接字的颜色格式从YUV420更改为BGR格式,但结果与上面的问题相同。尝试使用MemoryStream转换为位图的代码:

while (transcoder.Pull(out inputIndex, yuvFrame))
{
    buffer = (MediaBuffer) yuvFrame.Buffer.Clone();
    Bitmap b;

    byte[] temp = new byte[buffer.DataSize];
    Array.Copy(buffer.Start, buffer.DataOffset, temp, 0, buffer.DataSize);
    var ms = new MemoryStream(temp);
    b = new Bitmap(ms);
}
上述异常在代码的最后一行抛出。我不确定是颜色格式还是流类型,还是其他原因导致了这个问题。如果有人想看到更多的代码(设置输入和输出套接字等),请告诉我。作为参考,我从AVBlocks中看到的示例链接是,到MediaBuffer类的链接是。

位图(MemoryStream ms)构造函数期望实际文件中的字节,如png、jpeg、bmp或gif。如果我读对了,你就没有了;您只有纯RGB三元组数据。这还不够,因为它缺少关于图像宽度、高度、颜色深度等的所有信息

您将需要从RGB数据实际构造图像对象。这并不是一件小事;这意味着您需要创建具有正确尺寸和颜色格式的新图像对象,然后访问其备份字节数组,并将数据写入其中。可以找到用字节数组创建图像的实际代码

请注意,您必须考虑得到的结果数据中的实际步幅;图像每行上的字节数。图像按行保存,这些行通常填充为4字节的倍数。如果你不考虑这一点,显然会把事情搞得一团糟


如果您的数据是完全压缩的,那么我链接到的
BuildImage
函数的
stride
将是您的图像宽度乘以每个像素的字节数(对于24bpp RGB,应该是3),如果不是,您必须将其填充到4的下一个倍数。

参数
MemoryStream
不需要原始RGB数据。它需要已知文件格式的字节,如png、jpeg、bmp、gif等。