我有一个基于Directshow的媒体播放器应用程序。它在普通的游戏过程中运行良好,没有任何问题。但是,当Mediaplayer刚刚在系统启动后启动时,我偶尔会遇到一个问题。
HRESULT CSDirectShow::RenderOutputPins (IBaseFilter* pFilter)
{
const char* funcName = "CSDirectShow::RenderOutputPins()";
HRESULT hr = S_OK;
// Enumerate all pins on the source filter,
// looking for the output pins so that I can call Render() on them
//
CComPtr< IEnumPins > pEnumPin;
if (!FAILED (pFilter->EnumPins (&pEnumPin)))
{
while (true)
{
// get the next pin
//
CComPtr< IPin > pPin;
if (pEnumPin->Next (1L, &pPin, NULL) != S_OK) break;
// I'm not interested in connected pins
// if this pin is an unconnected output pin, then render it.
//
CComPtr< IPin > pConnectedPin;
if (pPin->ConnectedTo (&pConnectedPin) == VFW_E_NOT_CONNECTED)
{
PIN_DIRECTION pinDirection;
PIN_INFO pinInfo;
//Get the information of the pin
if (pPin->QueryDirection (&pinDirection) == S_OK
&& pinDirection == PINDIR_OUTPUT
&& pPin->QueryPinInfo(&pinInfo) == S_OK
&& strstr((char*)pinInfo.achName,"~")==NULL)
{
if (FAILED (hr = m_pGB->Render (pPin)))
{
SafeRelease(&pinInfo.pFilter);
return hr;
}
}
SafeRelease(&pinInfo.pFilter);
}
}
}
TraceMsg ("%s: exit",funcName);
return S_OK;
}
当 m_pGB-&gt; Render(pPin) 被调用时,此函数永远不会返回并且在内部被阻止。我确认使用日志。此问题仅在我发生时才会发生启动后立即启动我的应用程序。当我关闭并重启我的应用程序时出现问题它就像魅力一样。因为应用程序被设计为在系统启动后自动启动,这种行为已成为一个更大的问题。帮助
答案 0 :(得分:0)
IGraphBuilder.Render
调用在内部做了很多,特别是它重复了可能合适的过滤器的枚举,后者又尝试加载在DirectShow环境中注册的其他DLL。此类文件可能缺少依赖项,或者依赖于远程或暂时无法访问的驱动程序(仅举一例)。
如果您遇到死锁,可以进一步排除故障(调试它)并获取锁定状态的详细信息以及渲染调用期间的活动。
如果问题是由第三方过滤器(特别是编解码器包一次注册一组过滤器而不考虑兼容性)引起的,那么系统注册的方式不太好,也许您可以识别它们并卸载。
如果你想改善你身边的玩家,你应该避免使用渲染调用,并以较小的增量构建你的过滤器图形 - 添加特定的过滤器和连接引脚,而不需要使用大智能连接的大任务,这在一般但对上述兼容性问题很敏感。