以下代码擅长呈现无音频的MPG文件:

IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer)));
IFileSourceFilter *pSourceFilter;
IBaseFilter *pBaseFilter;
CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSourceFilter));
pSourceFilter->QueryInterface(IID_PPV_ARGS(&pBaseFilter));
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");
pSourceFilter->Load(filename, NULL);
pGraphBuilder->AddFilter(pBaseFilter, L"File Source Filter");

但是带有音频的WMV文件失败。当我将视频源的唯一输出与视频渲染器的唯一输入相连时,失败发生在以下调用中。
pGraphBuilder->Connect(pOutPin[0], pInPin[0])

返回 -2147220969 。如果我将以下代码替换为以下代码:
IBaseFilter *pRenderer;
CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pRenderer));
IBaseFilter *pBaseFilter;
pGraphBuilder->AddSourceFilter(filename, L"Renderer Filter", &pBaseFilter);
pGraphBuilder->AddFilter(pRenderer, L"Renderer Filter");

那么MPG可以很好地发挥以下作用:
pGraphBuilder->Connect(pOutPin[0], pInPin[0])

虽然WMV会导致与上述相同的错误,但是相反,它将倒置播放:
pGraphBuilder->Connect(pOutPin[1], pInPin[0])

所有这些都意味着第二种编码样式将创建一个具有两个输出引脚的源,并且可能将音频映射到第一个。或者,也许DirectShow自动插入了A / V分离器。
  • 我的理解是 AddSourceFilter 可以透明地创建拆分器。这是正确的吗?
  • 如果我想手动进行操作,应该使用哪个组件?
  • 为什么WMV视频上下颠倒?
  • 最佳答案



    哪个是 0x80040217 VFW_E_CANNOT_CONNECT "No combination of intermediate filters could be found to make the connection."

    这是您手动添加CLSID_AsyncReader的结果:Windows Media文件通常通过另一个源过滤器呈现(使用Windows SDK中的GraphEdit呈现文件,您将能够检查拓扑)。



    是,如果splitter与Async Reader兼容,则不是这样。



    使用GraphEdit可以交互地创建拓扑,您将对如何执行代码有所了解。



    由于拓扑。最有可能的是您在管道上有一个怪异的过滤器组合,包括第三方过滤器。检查有效的拓扑是解决问题的关键。

    关于winapi - AddSourceFilter行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17428675/

    10-11 07:11