1

我正在尝试从我的 C# 应用程序中征服 VFW。之前的大部分事情都还很模糊,毕竟我已经到了最后一点才完成。

当我使用一组消息启动相机驱动程序时

  • WM_CAP_GET_VIDEOFORMAT
  • WM_CAP_SET_VIDEOFORMAT

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

当我用视频格式选择调出VFW Dialog时,我可以看到YUY2(可选并且可以设置),以及可以选择的MJPG,但是这导致黑屏作为视频捕获结果。

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

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

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

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

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

谢谢。

UPD。哇,感谢我将十进制数据转换为十六进制(压缩值)的自发想法,我在 Google 中发现了它的 YUY2 编解码器类型的压缩。全桌在这里

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

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

4

1 回答 1

0

0x32595559字面意思是“YUY2”。要在 C++ 代码中构建此常量,可以使用MAKEFOURCC('Y', 'U', 'Y', '2'). 这个 [well known] 值表明捕获的视频数据将使用这种像素格式进行编码。

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

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

于 2015-08-13T06:38:30.623 回答