MediaFoundation与多输入设备?

时间:2015-06-04 12:06:36

标签: video-capture ms-media-foundation

我有一个项目,源设备有一个SVideo和一个可用于捕获的复合连接器。在DirectShow中,我可以使用IAMCrossbar来设置要捕获的那个,但是在MediaFoundation中,当我尝试开始流式传输时(使用SourceReader),我只获得单个视频流和C00D3704状态。有没有办法在MediaFoundation中选择输入?

注意:LEADTOOLS声称能够做到这一点,但我不知道如何做到这一点。我发现的其他任何事情都没有说明如何去做。

指向正确的界面和/或属性就足够了......

1 个答案:

答案 0 :(得分: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的内容;

假设您的捕获卡具有相当新的驱动程序,我确信您将找到并从您的可用流中读取而没有太多麻烦。祝你好运。