2017-04-18 32 views
0

我有一個基於Directshow的mediaplayer應用程序。它在正常的playabck中沒有任何問題,效果很好。但偶爾我會遇到一個問題,當Mediaplayer剛開始系統啓動後。DIrectshow功能在系統啓動時被阻止

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)被調用時,這個函數永遠不會返回它被阻止使用日誌。這裏面的問題。我確認只發生時,我立即開始我的應用程序啓動後。當問題occures如果我關閉並重新啓動我的應用程序它就像一個魅力。自從應用程序被設計爲自動啓動系統啓動後,這種行爲已經成爲一個更大的擔憂.Kindly幫助

回答

0

IGraphBuilder.Render通話做了很多內部,具體而言重複枚舉可能合適的過濾器,然後再嘗試加載在DirectShow環境中註冊的附加DLL。這樣的文件可能會缺少依賴關係,或者依賴於遠程或臨時無法訪問的驅動程序(僅舉一例)。

如果遇到死鎖,您可以進一步排除故障(調試它)並獲取有關鎖定狀態以及Render調用期間活動的詳細信息。

如果問題是由第三方過濾器(尤其是編解碼器包註冊過濾器集合,而沒有考慮過多的兼容性)導致的,以不太好的方式向系統註冊,也許您可​​以識別它們並卸載。

如果您希望改進播放器,您應該避免使用渲染調用,並以較小的增量構建濾波器圖形 - 添加特定濾波器和連接引腳,而不需要智能連接留下大量任務,這很好一般而言,但對上述兼容性問題很敏感。