0

以下代码擅长渲染没有音频的 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 视频呈现颠倒?
4

2 回答 2

2

返回 -2147220969

这是0x80040217 VFW_E_CANNOT_CONNECT“找不到中间过滤器的组合来建立连接。”

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

我的理解是 AddSourceFilter 可以透明地创建拆分器。这是对的吗?

是的,如果拆分器与 Async Reader 兼容,但情况并非如此。

如果我想手动完成,我应该使用哪个组件?

使用 GraphEdit 以交互方式创建拓扑,您将了解如何处理代码。

为什么 WMV 视频呈现颠倒?

因为拓扑。您很可能在管道上有奇怪的过滤器组合,包括第三方过滤器。检查有效的拓扑结构是解决问题的关键。

于 2013-07-02T14:57:58.843 回答
1

使用 pGraphBuilder->AddSourceFilter() 为特定文件添加源过滤器。不要假设 File Source (Async) 是正确的源过滤器(对于某些格式,源和 demux 组合成一个过滤器)。

于 2013-07-02T16:19:20.977 回答