首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有多输入装置的MediaFoundation?

带有多输入装置的MediaFoundation?
EN

Stack Overflow用户
提问于 2015-06-04 12:06:36
回答 1查看 546关注 0票数 0

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

注: LEADTOOLS声称能够做到这一点,但我不知道如何做到。我发现的其他东西都说不出该怎么做。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 21:22:45

答案取决于具体的捕获卡,但还是相当简单。一些捕获卡(如双头数据路径卡)将显示为两个独立的设备(对于系统中的每一张卡)。因此,您将在枚举之后分别激活它们(为简洁而省略的错误检查):

代码语言:javascript
运行
复制
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上找到单独的流类型。

代码语言:javascript
运行
复制
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 )。我将详细介绍这个主题,这里

如果您打算同时捕获音频,您将不得不构建一个聚合源,这是我写过的关于这里的一点;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30643426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档