1

我想要做什么

我正在尝试使用 DirectShow 框架和使用 VS2008 的 VC++ 语言创建一个示例 USB 相机流应用程序(或多或少像 amcap 的剥离版本)。以下是我用来构建的过滤器图信息。

过滤器图

网络摄像头(捕获引脚)- 智能 Tee(预览引脚)- 将单色 Y8 转换为 YUY2 的转换过滤器 - 视频混合渲染。

附加信息

  • 网络摄像头以 640x480、Y8 @ 30FPS 流式传输。
  • 在 Windows 7 Professional、Intel i3 上测试 - 运行良好,能够以 30FPS 的速度传输 VGA。
  • 视频捕捉过滤器中没有可用的预览图钉。

问题

使用相同的过滤器图设置,我在 Windows 8 Intel i3 PC 上遇到问题。但是,如果我用 Microsoft SDK 中提供的 Infinte Tee 示例替换 Smart Tee 过滤器,它工作得很好。为什么智能 tee 过滤器在 Windows 8 中不起作用?

编辑:问题是我无法在 Windows 8 上将视频捕获过滤器连接到智能 tee 过滤器,但能够在 Windows 7 上连接。我尝试通过 graphedit 工具。Windows 8 正在尝试为 Y8 媒体子类型形成下图(YUY2 工作正常)。

网络摄像头(捕获引脚)- 将单色 Y8 转换为 YUY2 的转换过滤器 - 智能 Tee(预览引脚)- 视频混合渲染。

当我运行图表时,graphedit 异常关闭。

如果我没有注册转换过滤器,则在将 Capture 过滤器与智能 tee 连接时会收到此错误。 '这些过滤器无法就连接达成一致。验证输入和输出引脚的类型兼容性。找不到中间过滤器的组合来建立连接。(返回码 = 0x80040217)'

此外,如果我使用 Infinte tee 滤镜,每隔几分钟就会出现帧率下降。Windows 7 和 Windows 8 上的智能三通过滤器有什么区别?什么可以用作智能三通的替代品?

在此先感谢您的帮助。

4

2 回答 2

1

Smart Tee Filter 不太可能不好 - 它与 Windows 7 中的过滤器几乎没有什么不同。相反,问题的可能位置是相机驱动程序,尤其是 Y8 格式。我会在这种媒体类型中寻找导致连接问题的问题,或者您可能想通过IAMStreamConfig::SetFormat或通过属性页选择更流行的格式,例如 YUY2/YV12,或者有问题的 Y8 格式是交错的,并且VIDOINFOHEADER2由 tee 不支持的格式定义。或者,您可能只需要更新相机硬件的驱动程序。

Inf Tee Filter 的速率下降问题再次表明您需要检查相机驱动程序。

Smart Tee vs. Infinite Pin Tee

两者都是分离器,当一个有问题时,这是一个典型的问题,那么是否真的可以用另一个替换它。

两个过滤器都实现了一个非常简单的任务,并且两个过滤器都故意实现了自己的技巧。Smart Tee 过滤器去除时间戳以将实时馈送转换为预览。出于捕获目的,您通常不太关心延迟,只要流完整性完好无损并且帧相对于另一个帧是好的。出于演示目的,您通常会根据时钟匹配时间戳,并且您不需要在实时预览中使用它,因为您想要的只是尽快显示帧。这是 Smart Tee 适用的地方,它对其他任何东西都没有好处。

相反,Infinite Pin Tee 过滤器在不修改的情况下复制输入馈送。所以它不能满足您对实时视频预览的期望,并且直接用另一个过滤器替换一个过滤器只是不能完成预期的工作。过滤器甚至无法复制/复制数据,因此它在其输出引脚之间共享内存分配器,这可能会产生许多问题。然而,它完成了复制工作并增加了最小的开销。

此外,类似 Inf Pin Tee 的过滤器在源代码中作为 Windows SDK 示例提供\Samples\multimedia\directshow\filters\inftee

用 Inf Pin Tee 过滤器快速替换 Smart Tee 过滤器是这样的:

捕获 -> Inf Tee -> 样品采集器 -> ...

Sample Grabber 设置为SampleCB回调的位置,您的回调将从视频帧中删除时间戳。通过这种方式,您可以将一个 T 恤替换为另一个以进行实时预览。

于 2013-10-17T08:26:29.877 回答
0

希望现在通过我如何定义我的 Y8 变换过滤器来清楚这一点。我在我的转换过滤器中验证 VIDEOINFOHEADER 而不是 VIDEOINFOHEADER2。

 DEFINE_GUID(MEDIASUBTYPE_Y8, 
 0x20203859, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);

// Media Types
const AMOVIESETUP_MEDIATYPE sudInputPinTypes[] =   
{ 
    {
        &MEDIATYPE_Video,
        &MEDIASUBTYPE_Y8
    }
};
const AMOVIESETUP_MEDIATYPE sudOutptuPinTypes[] =   
{ 
    {
        &MEDIATYPE_Video, 
        &MEDIASUBTYPE_YUY2
    }
};

// Pins
const AMOVIESETUP_PIN psudPins[] = 
{ 
    { 
        L"Input", 
        FALSE,
        FALSE, 
        FALSE, 
        FALSE, 
        &CLSID_NULL, 
        NULL,
        1, 
        sudInputPinTypes
    }, 
    { 
        L"Output", 
        FALSE, 
        TRUE, 
        FALSE, 
        FALSE, 
        &CLSID_NULL,
        NULL, 
        1, 
        sudOutptuPinTypes
    } 
};   

// Filters
const AMOVIESETUP_FILTER sudGrayScaleFilter =
{
    &CLSID_GrayScaleTransformFilter,        // Filter CLSID
    GRAYSCALE_FILTER_NAME,                  // String name
    MERIT_UNLIKELY,                         // Filter merit
    2,                                      // Number of pins
    psudPins                                // Pin information
};                   

// Templates
CFactoryTemplate g_Templates[]=
{
    { 
        GRAYSCALE_FILTER_NAME, 
        &CLSID_GrayScaleTransformFilter,
        CGrayScaleFilter::CreateInstance, 
        NULL, 
        &sudGrayScaleFilter
    }
};

让我知道您是否需要更多信息来帮助我:-)

谢谢你。

于 2013-10-18T09:15:35.350 回答