我想做什么,
我正在尝试使用DirectShow框架创建一个示例USB摄像头流应用程序(或多或少类似于剥离版的amcap),并使用VC++语言使用VS2008。下面是我用来构建的过滤器图形信息。
滤波图
网络相机(捕捉针)-智能Tee (预览针)-转换过滤器转换单色Y8到YUY2 -视频混合渲染。
附加信息
问题
使用相同的过滤器图形设置,我面临的问题,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恤的替代品?
提前谢谢你的帮助。
发布于 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时,您的回调将从视频帧中删除时间戳。通过这种方式,您可以用另一个三通替换另一个,以便进行实时预览。
发布于 2013-10-18 09:15:35
希望我如何定义我的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
}
};让我知道你是否需要更多的资料来帮助我:
谢谢。
https://stackoverflow.com/questions/19402035
复制相似问题