具有多输入设备的 MediaFoundation?

MediaFoundation with multi-input device?

我有一个项目,其中源设备有一个 SVideo 和一个可用于捕获的复合连接器。在 DirectShow 中,我可以使用 IAMCrossbar 来设置从哪个视频流进行捕获,但是在 MediaFoundation 中,当我尝试开始流式传输(使用 SourceReader)时,我只能获得一个视频流和一个 C00D3704 状态。有什么方法可以 select MediaFoundation 中的输入吗?

注意:LEADTOOLS 声称能够做到这一点,但我不知道如何做到。我发现的其他任何内容均未说明如何操作。

指向正确接口 and/or 属性的指针就足够了...

答案取决于具体的采集卡,但非常简单。一些采集卡(如双头 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). I go into some detail on that topic here

如果您打算同时捕获音频,则必须构建一个聚合源,我对此写了一些内容 here;

假设您的采集卡有相当新的驱动程序,我相信您会毫不费力地找到可用的流并从中读取。祝你好运。