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