MediaFoundation 与多输入设备?
Posted
技术标签:
【中文标题】MediaFoundation 与多输入设备?【英文标题】:MediaFoundation with multi-input device? 【发布时间】:2015-06-04 12:06:36 【问题描述】:我有一个项目,其中源设备有一个 SVideo 和一个可用于捕获的复合连接器。在 DirectShow 中,我可以使用 IAMCrossbar 来设置从哪个捕获,但在 MediaFoundation 中,当我尝试开始流式传输(使用 SourceReader)时,我只得到一个视频流和 C00D3704 状态。有什么方法可以在 MediaFoundation 中选择输入吗?
注意:LEADTOOLS 声称能够做到这一点,但我不知道如何做到这一点。我发现没有其他东西可以说明如何做到这一点。
指向正确接口和/或属性的指针就足够了...
【问题讨论】:
【参考方案1】:答案取决于具体的采集卡,但非常简单。一些采集卡(如双头Datapath 卡)将显示为两个独立的设备(对于系统中的每张卡)。因此,您将在枚举之后单独激活它们(为简洁起见,省略了错误检查):
UINT32 deviceCount = 0;
IMFActivate** devices = nullptr;
Microsoft::WRL::ComPtr<IMFAttributes> attributes = nullptr;
hr = ::MFCreateAttributes(attributes.GetAddressOf(), 1);
hr = ::attributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
hr = ::MFEnumDeviceSources(attributes.Get(), &devices, &deviceCount);
然后使用GetMediaFoundationActivator
和成员函数ActivateObject
激活设备。
这对于像上面提到的卡这样的卡来说是有意义的,因为它在卡上为每个输入提供了单独的硬件。结果,您可以同时激活每个。
但是,驱动程序可以将您的 SVideo 和 Composite 报告为一个设备,因为它可能使用相同的硬件。在这种情况下,您会在单个 IMFSourceReader
上找到单独的流类型。
IMFMediaType* mediaType = nullptr;
HRESULT hr = S_OK;
while (hr == S_OK)
hr = reader->GetNativeMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, index, &mediaType);
if (hr == MF_E_NO_MORE_TYPES)
break;
// ... [ process media type ]
++index;
在这种情况下,您设置流选择 (IMFSourceReader::SetStreamSelection)。我将详细介绍该主题here。
如果您打算同时捕获音频,则必须构建一个聚合源,我写了一些关于 here 的内容;
假设您的采集卡有相当新的驱动程序,我确信您会毫不费力地定位和读取可用的流。祝你好运。
【讨论】:
该死!我希望这是我错过的东西,但你的(非常好的和详细的)回答告诉我我一直都有正确的想法。有问题的设备是 Hauppauge USB-Live2 和 Startech.com SVID2USB2NS。鉴于两者都在单个设备上公开单个视频流,我可能是他们的 SOL。以上是关于MediaFoundation 与多输入设备?的主要内容,如果未能解决你的问题,请参考以下文章
MediaFoundation中是不是有实时混音效果或MFT?
SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”