DirectShow功能在系统启动时被阻止

DIrectshow function is blocked at system bootup

本文关键字:系统启动 功能 DirectShow      更新时间:2023-10-16

我有一个基于直接表演的MediaPlayer应用程序。在普通游戏期间,它效果很好,没有任何问题。但是有时候,当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->渲染(ppin(时,此函数永远不会返回,并且它被阻止内部。我使用日志确认了。此问题仅在我启动时发生启动后立即使用我的应用程序。当我关闭并重新启动应用程序时,出现问题时,它的工作就像魅力一样。由于应用程序旨在在系统启动后自动启动此行为已成为更大的问题。

IGraphBuilder.Render呼叫在内部进行了很多操作,具体而言,它会枚举潜在合适的过滤器,进而尝试加载在DirectShow环境中注册的其他DLL。此类文件可能缺少依赖关系,或者对远程或暂时无法访问的驱动程序的依赖项(仅一个示例(。

如果您遇到僵局,则可以对其进行进一步解决(调试(并获取有关锁定状态的详细信息以及在渲染呼叫期间的活动。

如果问题是由第三方过滤器引起的(尤其是编解码器包装,立即注册过滤器的集合而不考虑兼容性太多(,以不太好的方式注册,也许您可以识别它们并卸载它们。

如果您想改善播放器,则应避免呈现呼叫,并以较小的增量构建滤波器图 - 添加特定的过滤器和连接销,而无需在智能连接的Mercy中留下重大任务,这在一般但对兼容性问题很敏感。