ISampleGrabber可以将视频帧转换为特定的媒体类型吗?
can ISampleGrabber convert the video frames to a specific mediaType?
我在网上找到了这个很好的例子来解释directshow是如何工作的。
http://alax.info/trac/public/browser/trunk/Utilities/SetLifeCamStudioResolutionSample/SetLifeCamStudioResolutionSample.cpp在这个例子中有两个采样器。一个叫NON-RGB grabber,一个叫RGB-grabber。
第一个:(NON-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是安全的,同时几乎任何压缩视频格式都会失败(除非源已经可以提供完全匹配的格式)。
请注意,如果智能连接提供额外的转换过滤器,它们附加到上游的样本采集器,而不是在它里面。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 媒体基础获取拓扑节点的 IMFMedia类型
- ADTF 无结构类型"错误的媒体说明
- 获取外部媒体类型
- ISampleGrabber可以将视频帧转换为特定的媒体类型吗?
- Windows Media Foundation:当前媒体类型更改