gpt4 book ai didi

c++ - ISampleGrabber 可以将视频帧转换为特定的媒体类型吗?

转载 作者:行者123 更新时间:2023-11-28 00:45:04 28 4
gpt4 key购买 nike

我在互联网上找到了这个解释 directshow 工作原理的好例子。

http://alax.info/trac/public/browser/trunk/Utilities/SetLifeCamStudioResolutionSample/SetLifeCamStudioResolutionSample.cpp

在那个例子中有两个样本采集器。一种称为非 RGB 采集器,一种称为 RGB 采集器。

第一个:(非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() 说明样本采集器过滤器的输入引脚中可用的数据类型。如果可以在不设置媒体类型的情况下使用样本采集器,我为什么要将其设置为任何值?

问题:

样本采集器是否进行任何类型的媒体转换?

为什么要设置采样器的媒体类型?

如果将来自摄像头的媒体类型设置为 MJPG,而我在采样器中将媒体类型设置为 RGB24,会发生什么情况?

使用一个比另一个有什么性能差异吗?要提高软件的性能 (fps),我应该删除其中一个样本采集器吗?

谢谢!

最佳答案

Sample Grabber Filter 不做任何转换。这就是为什么它可以灵活地接受各种格式,包括视频和音频,而无需了解具体的格式。

当您在 Sample Grabber 上设置媒体类型时,您强制它仅使用此类型。只接受这种类型而拒绝其他类型。连同Intelligent Connect ,如果可能的话,DirectShow 可能会提供额外的过滤器以转换为请求的格式。 24 位 RGB 通常是可行的,因为它是一种“通用未压缩视频格式”。这就是为什么将媒体类型设置为 24 位 RGB 是安全的,同时几乎任何压缩视频格式都会失败(除非源已经可以提供完全匹配的)。

请注意,如果 Intelligent Connect 提供额外的转换过滤器,它们将连接到 Sample Grabber 的上游,而不是在其内部。

关于c++ - ISampleGrabber 可以将视频帧转换为特定的媒体类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588805/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com