【问题标题】:DirectShow SmartTee behaviour on Windows 8Windows 8 上的 DirectShow SmartTee 行为
【发布时间】:2013-10-16 11:19:45
【问题描述】:

我要做什么

我正在尝试使用 VS2008 使用 DirectShow 框架和 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 过滤器和 smart tee 时会收到此错误。 '这些过滤器无法就连接达成一致。验证输入和输出引脚的类型兼容性。找不到中间过滤器的组合来建立连接。 (返回码 = 0x80040217)'.

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

提前感谢您的帮助。

【问题讨论】:

  • 你写“我面临问题”到底是什么意思?
  • 您好 Roman,我已经更新了我的帖子以说明问题。请原谅不清楚的帖子。

标签: visual-studio-2008 windows-8 camera directshow platform-sdk


【解决方案1】:

智能 Tee 过滤器不太可能不好 - 它与 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 恤替换为另一个以进行实时预览。

【讨论】:

  • 感谢您的回复罗曼。这里有几件事你的观点。 1. 是的,问题可能出在为 Windows 8 提供的智能 tee 过滤器中。智能 tee 过滤器可能被修改为不接受非标准媒体​​格式,如 Y8、BY8 或 GREY。但是没有关于此的文档或说明。 2.我不认为帧率下降是相机方面的。如果我使用智能三通过滤器,则视频渲染器帧速率不会下降。如果我使用无限 tee 或不使用任何 tee 过滤器,那么视频渲染器的帧速率会以非常频繁的间隔下降。是否有任何智能三通过滤器的克隆可用源代码?
  • 1 我不相信智能 Tee 过滤器修改 2 Inf Tee 丢帧是可能的,因为帧稍晚。就正常操作而言,这很好:智能 tee 删除时间戳,以便实时帧永远不会迟到,并且在 tee 的帧中 - 即使稍微迟到 - 也可能会被丢弃。这就是为什么不使用 inf tee 来预览实时提要的原因3 我不知道带有源代码的智能 tee,但是您可以通过使用去除时间戳的 inf tee + 示例抓取器轻松实现相同的效果SampleCB 回调。
  • 如果我的理解有误,请纠正我。对于预览 - 不需要时间戳 - 如果使用无限三通,我们可以在视频渲染之前连接 samplegrabber。对于视频捕获 - 我们需要时间戳 - 无限 tee 可以连接到 avi 多路复用器和文件写入器(让我们假设我想保存 avi 视频)。但是使用无限 tee,如果我执行录制,graphedit 会崩溃。
  • 你指定Samplegrabber在SampleCB剥离时间戳,是不是它不会在BufferCB剥离?
  • 我建议完全忘记BufferCB。它完全不如SampleCB,但许多样本都使用它。他们在可以使用两者中的任何一个的情况下这样做。
【解决方案2】:

希望现在通过我如何定义我的 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-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多