我在互联网上找到了这个很好的例子,解释了directshow的工作原理。
在该示例中,有两个samplegrabbers。一个叫做NON-RGB抓取器,一个叫RGB-grabber。
第一个:(非RGB)
#pragma region Non-RGB Sample Grabber
{
CComPtr<IBaseFilter> pBaseFilter;
ATLENSURE_SUCCEEDED(pBaseFilter.CoCreateInstance(__uuidof(SampleGrabber)));
ATLENSURE_SUCCEEDED(pFilterGraph->AddFilter(pBaseFilter, L"Non-RGB Sample Grabber")); // This will connect in MJPG format
const CComQIPtr<ISampleGrabber> pSampleGrabber = pBaseFilter;
ATLASSERT(pSampleGrabber);
#if TRUE
// NOTE: IFilterGraph::Connect would do just fine, but with a real capture device, if we prefer having Smart Tee added, we need to use
// Capture Graph Builder (only here)
CComPtr<ICaptureGraphBuilder2> pCaptureGraphBuilder;
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2));
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder->SetFiltergraph(pFilterGraph));
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, pCurrentOutputPin, NULL, pBaseFilter));
#else
ATLENSURE_SUCCEEDED(pFilterGraph->Connect(pCurrentOutputPin, GetPin(pBaseFilter, 0)));
#endif
MessageBox(GetActiveWindow(), _T("After Non-RGB Sample Grabber Connected"), _T("Debug"), MB_OK);
pCurrentOutputPin = GetPin(pBaseFilter, 1);
}
#pragma endregion
第二个:(RGB)
#pragma region RGB Sample Grabber
{
CComPtr<IBaseFilter> pBaseFilter;
ATLENSURE_SUCCEEDED(pBaseFilter.CoCreateInstance(__uuidof(SampleGrabber)));
ATLENSURE_SUCCEEDED(pFilterGraph->AddFilter(pBaseFilter, L"RGB Sample Grabber"));
const CComQIPtr<ISampleGrabber> pSampleGrabber = pBaseFilter;
ATLASSERT(pSampleGrabber);
AM_MEDIA_TYPE MediaType;
ZeroMemory(&MediaType, sizeof MediaType);
MediaType.majortype = MEDIATYPE_Video;
MediaType.subtype = MEDIASUBTYPE_RGB24;
ATLENSURE_SUCCEEDED(pSampleGrabber->SetMediaType(&MediaType));
ATLENSURE_SUCCEEDED(pFilterGraph->Connect(pCurrentOutputPin, GetPin(pBaseFilter, 0)));
MessageBox(GetActiveWindow(), _T("After RGB Sample Grabber Connected"), _T("Debug"), MB_OK);
pCurrentOutputPin = GetPin(pBaseFilter, 1);
}
#pragma endregion
“setmediatype()”方法仅用于“RGB”版本。但我想知道。在MSDN页面上说setmediatype()表示样本采集器过滤器的输入引脚中可用的数据类型。如果可以在不设置媒体类型的情况下使用样本采集器,为什么要将其设置为任何内容?
问题:
样本采集器是否进行任何类型的媒体转换?
为什么要设置样本采集卡的媒体类型?
如果mediatype形式的cam设置为MJPG,并且我在samplegrabber中将媒体类型设置为RGB24,会发生什么?
使用一个在另一个上会有任何性能差异吗?为了提高软件的性能(fps),我应该删除其中一个样本采集卡吗?
谢谢!
答案 0 :(得分:3)
Sample Grabber Filter不进行任何转换。这就是为什么它可以灵活地接受各种格式,包括视频和音频,而不了解具体的个别格式。
在Sample Grabber上设置媒体类型时,强制它仅使用此类型。仅接受此类型并拒绝其他类型。与Intelligent Connect一起,这可以使DirectShow可以提供额外的过滤器,以便在可能的情况下转换为请求的格式。它通常可以使用24位RGB,因为它是一种通用的无压缩视频格式&#34;。这就是为什么将媒体类型设置为24位RGB是安全的,同时几乎任何压缩视频格式都会失败(除非源已经可以提供完全匹配)。
请注意,如果Intelligent Connect提供额外的转换过滤器,它们会附加到Sample Grabber的上游,而不是在其内部。