由VFW(C#)返回的默认图像格式有一些未记录的值

由VFW(C#)返回的默认图像格式有一些未记录的值,c#,video-capture,vfw,C#,Video Capture,Vfw,我正试图从我的C#应用程序中征服VFW。大多数事情以前都是模糊不清的,毕竟我已经到了最后一点 当我启动摄像头驱动程序时,会显示一组消息,如 WM_CAP_GET_VIDEOFORMAT WM_CAP_SET_视频格式 然后,我在GET_VIDEOFORMAT上接收到指向BITMAPINFO结构的指针,其中(我认为,因为网络摄像机没有安装其本机驱动程序),结构中有一个名为biCompression的项,其值非常奇怪=0x32595559(844715353)。 始终是相同的值,并且RGBQUA

我正试图从我的C#应用程序中征服VFW。大多数事情以前都是模糊不清的,毕竟我已经到了最后一点

当我启动摄像头驱动程序时,会显示一组消息,如

  • WM_CAP_GET_VIDEOFORMAT
  • WM_CAP_SET_视频格式
然后,我在GET_VIDEOFORMAT上接收到指向BITMAPINFO结构的指针,其中(我认为,因为网络摄像机没有安装其本机驱动程序),结构中有一个名为biCompression的项,其值非常奇怪=0x32595559(844715353)。 始终是相同的值,并且RGBQUAD-全部为零。 请参见该值为十进制格式的快照:

当我调出带有视频格式选择的VFW对话框时,我可以看到YUY2(可选择且可设置)和MJPG(可选择),但这会导致视频捕获结果出现黑屏

当我调用SET_VIDEOFORMAT并向VFW发送标准BMP RGB 640x480格式(无压缩)时,SendMessage返回0(零),这意味着无法设置。同时,将结构(带有GET_VIDEOFORMAT上接收到的奇怪压缩值)发送回as SET_VIDEOFORMAT,返回1,这意味着VFW接受了它

所以我想知道为什么会这样?要么是操作系统(Win7)没有特定的编码解码器用于普通BMP未压缩,要么是因为网络摄像头没有安装其驱动程序

另一个问题是:BITMAPINFO压缩项中的0x32595559值是什么意思

我已经将其视为正常的24位YUV数据,但是生成的图像是黑白的,没有颜色,尽管在视频流期间它是彩色的,如果我从剪贴板获得它,它也是彩色的

如何处理这样的碰撞,请帮助我,如果你有理由知道它。 如果你对此很在行的话,我很乐意为你效劳

谢谢

UPD。哇,多亏了我自发的将十进制数据转换成十六进制(压缩值)的想法,我在谷歌找到了YUY2编解码器那种压缩。 满桌都是

好的,但问题仍然没有答案。若PC并没有为未压缩的RGB位图包含合适的编解码器,那个么当我发送SET_VIDEOFORMAT时,VFW框中实际发生了什么? 它是否搜索合适的编解码器并尝试将其附加到现有的视频流图


我认为这个问题的答案将有助于让每个人理解VFW。

0x32595559
字面上代表“YUY2”。若要在C++代码中构建此常量,则可以执行<代码> MaGeFrCC(‘y’、‘u’、‘y’、‘2’’)/代码>。该[已知]值表示将使用该像素格式对捕获的视频数据进行编码

WM_CAP_SET_VIDEOFORMAT
WM_CAP_GET_VIDEOFORMAT
允许设置和获取视频捕获格式,但接受值的范围仅限于相机本身的实际支持,并由各自的驱动程序支持。这与已安装的编解码器无关,因为软件编解码器不会扩展相机对捕获视频进行编码的能力


这里也没有视频流图,您询问的是VFWAPI,而图来自另一个API DirectShow。使用VFW,您将获得相机支持的格式之一的视频帧(并配置为在其中传送视频),然后您可以自己处理这些数据,您可能希望查看合适的ICM/VCM编解码器并进行转换。0x32595559字面上代表“YUY2”。若要在C++代码中构建此常量,则可以执行<代码> MaGeFrCC(‘y’、‘u’、‘y’、‘2’’)/代码>。该[已知]值表示将使用该像素格式对捕获的视频数据进行编码

WM_CAP_SET_VIDEOFORMAT
WM_CAP_GET_VIDEOFORMAT
允许设置和获取视频捕获格式,但接受值的范围仅限于相机本身的实际支持,并由各自的驱动程序支持。这与已安装的编解码器无关,因为软件编解码器不会扩展相机对捕获视频进行编码的能力


这里也没有视频流图,您询问的是VFWAPI,而图来自另一个API DirectShow。使用VFW,您将获得相机支持的格式之一的视频帧(并配置为在其中传送视频),然后您可以自己处理这些数据,并且您喜欢不同的编码。您可能希望向上查看合适的ICM/VCM编解码器并进行转换。

如果要使用压缩,则需要执行自底向上的图像。高度=-480,而不是480。不确定如何在应用程序中执行此操作。您已经知道代码代表YUY2。现在,您所要做的就是在输出管脚上插入一个转换过滤器,将YUY2转换为RGB,并连接渲染器或下游的任何东西。或者,您可以在其中放置一个T形三通,并将变换连接到其中一个T形三通管脚,然后从那里抓住它。这取决于你想用它做什么。我不熟悉这个库,所以我不知道你对过滤图有多大的影响。对我来说,听起来像是在包装DShow。嗨,弗兰克,谢谢你的反馈。我正在处理VFW,我已经完成了从YUY2到位图的转换。它工作正常。我想了解的是。。。如果我是对的,在片场上会发生什么。它真的在寻找一个合适的编解码器来连接到当前的图形,那么我最好为每个客户提供YUV2编解码器,并使用从YUV2到RGD24bpp的转换。如果你想使用压缩,你需要做一个自底向上的图像。高度=-480,而不是480。不确定如何在应用程序中执行此操作。您已经知道代码代表YUY2。现在,您所要做的就是在输出管脚上插入一个转换过滤器,将YUY2转换为RGB,并连接渲染器或下游的任何东西。或者,您可以在其中放置一个T形三通,并将变换连接到一个T形三通