首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows 8上的DirectShow SmartTee行为

Windows 8上的DirectShow SmartTee行为
EN

Stack Overflow用户
提问于 2013-10-16 11:19:45
回答 2查看 1.5K关注 0票数 1

我想做什么,

我正在尝试使用DirectShow框架创建一个示例USB摄像头流应用程序(或多或少类似于剥离版的amcap),并使用VC++语言使用VS2008。下面是我用来构建的过滤器图形信息。

滤波图

网络相机(捕捉针)-智能Tee (预览针)-转换过滤器转换单色Y8到YUY2 -视频混合渲染。

附加信息

  • 网络摄像头流为640x480,Y8 @30 Web。
  • 测试的Windows 7专业,英特尔i3 -工作良好,能够流VGA @30 VGA。
  • 视频捕获过滤器中没有预览针。

问题

使用相同的过滤器图形设置,我面临的问题,Windows 8英特尔i3个人电脑。但是,如果我用Microsoft中提供的Infinte示例替换智能Tee过滤器,那么它的工作效果很好。为什么智能tee过滤器在Windows 8中不能工作?

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

网络相机(捕捉针)-转换过滤器,将单色Y8转换为YUY2 -智能T(预览针)-视频混合渲染。

当我运行这个图表时,graphedit会以异常结束。

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

此外,如果我使用无限tee过滤器,有帧速率下降后,每隔几分钟。Windows 7和Windows 8上的智能tee过滤器有什么区别?什么可以作为智能T恤的替代品?

提前谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-17 08:26:29

Smart过滤器不太可能是好的--它和Windows 7几乎没有什么不同。相反,这个问题很可能出现在摄像头驱动程序和Y8格式上。我将在此媒体类型中查找导致连接问题的问题,或者您可能希望通过IAMStreamConfig::SetFormat或通过属性页选择YUY2 2/ Y8 12等更流行的格式,或者使用tee不支持的Y8格式进行交错和定义。或者,你可能只需要一个驱动更新相机硬件。

Inf过滤器的速率下降问题再次表明,您需要检查相机驱动器。

Smart诉Infinite

两者都是分裂者,这是一个典型的问题,当有一个麻烦时,如果真的可以用另一个代替它。

这两个过滤器都实现了一个非常简单的任务,而且两个过滤器都是故意实现自己的技巧的。Smart过滤器剥离时间戳,将实时提要转换为良好的预览。为了捕获目的,您通常不太关心延迟,只要流完整性完整,并且帧之间是相对的。出于演示的目的,您通常会将时间戳与时钟匹配,并且您不需要在实时预览中使用它,因为您只想在有了它之后立即显示一个框架。这就是Smart适用的地方,它对其他任何事情都没有好处。

相反,Infinite滤波器不需要修改就可以复制输入源。因此,它不能像你期望的那样进行实时视频预览,而直接用另一个过滤器代替一个过滤器并不能完成预期的工作。过滤器甚至无法复制/复制数据,因此它在输出引脚之间共享内存分配器,这可能会造成许多问题。然而,它完成了重复的工作,增加了最小的开销。

此外,Inf样例过滤器可在源代码中作为Windows示例\Samples\multimedia\directshow\filters\inftee使用。

用Inf Pin Tee过滤器快速替换Smart Tee过滤器的“n”脏方法如下:

捕获-> Inf Tee ->样品抓取器-> .

当示例抓取器被设置为调用SampleCB时,您的回调将从视频帧中删除时间戳。通过这种方式,您可以用另一个三通替换另一个,以便进行实时预览。

票数 1
EN

Stack Overflow用户

发布于 2013-10-18 09:15:35

希望我如何定义我的Y8转换过滤器,这一点现在已经清楚了。我正在验证VIDEOINFOHEADER的转换过滤器,而不是VIDEOINFOHEADER2。

代码语言:javascript
复制
 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
    }
};

让我知道你是否需要更多的资料来帮助我:

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19402035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档