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

Default Image format, returning by VFW (C#), has some undocumented values

我正在尝试从我的 C# 应用程序中征服 VFW。之前很多事情都比较迷茫,毕竟到了最后的地步才完成。

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

然后我在 GET_VIDEOFORMAT 上收到指向 BITMAPINFO 结构的指针,其中(正如我所想,因为网络摄像头没有安装其本机驱动程序)结构中的一项名为 biCompression 的值非常奇怪 = 0x32595559 (844715353 ). 始终是相同的值,并且 RGBQUAD - 全为零。 请查看该值采用十进制格式的镜头:

当我用视频格式选择调出VFW对话框时,我可以看到YUY2(选择table并且可以设置)和可以选择的MJPG,但是会导致黑色屏幕作为视频捕获结果。

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

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

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

我已经把它当作正常的 24 位 YUV 数据处理了,但是生成的图像是黑白的,没有颜色,尽管在视频流中它是彩色的,如果我从剪贴板中获取它,它也是彩色的。

如何处理这种碰撞,请知道的帮帮我。 如果你对此非常满意,那么我很乐意 $$。

谢谢。

更新。哇,多亏了我将十进制数据转换为十六进制(压缩值)的自发想法,我在 Google 中找到了它的 YUY2 编解码器类型的压缩。 完整 table 是 here

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

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

0x32595559字面意思是"YUY2"。要在 C++ 代码中构建此常量,可以做 MAKEFOURCC('Y', 'U', 'Y', '2')。这个 [众所周知的] 值表示捕获的视频数据将使用此像素格式进行编码。

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

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