【问题标题】:DIrectshow function is blocked at system bootupDIrectshow 功能在系统启动时被阻止
【发布时间】:2017-04-18 05:13:28
【问题描述】:

我有一个基于 Directshow 的媒体播放器应用程序。它在正常 playabck 期间运行良好,没有任何问题。但有时我会在系统启动后启动 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->Render (pPin) 被调用时,这个函数永远不会返回并且它被阻塞在里面。我确认使用日志。这个问题只有在我开始时才会发生我的应用程序启动后立即。当我关闭并重新启动我的应用程序时出现问题时,它就像一个魅力。由于应用程序被设计为在系统启动后自动启动,这种行为已成为一个更大的问题。请帮助

【问题讨论】:

    标签: c++ windows directx media-player directshow


    【解决方案1】:

    IGraphBuilder.Render 调用在内部做了很多工作,特别是它遍历了可能合适的过滤器的枚举,进而尝试加载在 DirectShow 环境中注册的其他 DLL。此类文件可能缺少依赖项,或者依赖于远程或暂时无法访问的驱动程序(仅一个示例)。

    如果您遇到死锁,您可以进一步排除故障(调试它)并获取有关锁定状态和 Render 调用期间活动的详细信息。

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

    如果您想改善您身边的播放器,您应该避免 Render 调用,并以较小的增量构建您的过滤器图 - 添加特定的过滤器和连接引脚,而不会让大任务任由智能连接摆布,智能连接在一般,但对上面提到的兼容性问题很敏感。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2017-08-25
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多