2016-06-03 26 views
0

Ситуация:Нет видео при использовании Enhanced Video Renderer

Создание дешифрующего фильтра с прямым показом. Граф DecryptFileSource -> GDCL Mpeg-4 демультиплексирования -> FFDShow Video Decoder -> Enhanced Video Renderer

Издание:

  • GraphEdit: Показывает видео, работает штраф.
  • GraphStudioNext: показывает видео, работает отлично.
  • GraphEditPlus: не отображает видео, не работа.
  • Через Код: Не работает ни. Однако, если я заменю РВО с «Video Renderer» или «VMR9»

Другой пользователь имел этот вопрос here однако его ответ был расплывчатым. По словам Романа (в комментариях к предыдущей ссылке) для этого требуется конкретная инициализация. Однако я не уверен, как это сделать, чтобы инициализировать его.

Нет Ошибок при попытке создать граф через код. У меня есть поиск, и я вижу, что IMediaPosition работает. Просто нет видео, но звучит

ответ

0

Я нашел ответ.

  1. Compile EVRPresenter.dll находится в "Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Samples \ Мультимедиа \ MediaFoundation \ EVRPresenter"

  2. Установите DLL "regsvr32 EVRPresenter.dll"

  3. Скомпилируйте и включите MediaFoundation.dll в свой продукт. Link here

  4. Вместо того, чтобы создать объект, как я обычно делаю

Как это:

IBaseFilter pEnhancedVideoRenderer = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_EnhancedVideoRenderer)); 

вместо

 IBaseFilter pEVR = (IBaseFilter)new MediaFoundation.EVR.EnhancedVideoRenderer(); 
     hr = pGraph.AddFilter(pEVR, "Enhanced Video Renderer"); 

     MediaFoundation.EVR.IMFVideoDisplayControl m_pDisplay; 

     InitializeEVR(pEVR, 1, out m_pDisplay); 

InitializeEVR:

private void InitializeEVR(IBaseFilter pEVR, int dwStreams, out MediaFoundation.EVR.IMFVideoDisplayControl ppDisplay) 
     { 
      MediaFoundation.EVR.IMFVideoRenderer pRenderer; 
      MediaFoundation.EVR.IMFVideoDisplayControl pDisplay; 
      MediaFoundation.EVR.IEVRFilterConfig pConfig; 
      MediaFoundation.EVR.IMFVideoPresenter pPresenter; 

      // Before doing anything else, set any custom presenter or mixer. 

      // Presenter? 
      if (m_PresenterCLSID != Guid.Empty) 
      { 
       Type type = Type.GetTypeFromCLSID(m_PresenterCLSID); 

       // An error here means that the custom presenter sample from 
       // http://mfnet.sourceforge.net hasn't been installed or 
       // registered. 
       pPresenter = (MediaFoundation.EVR.IMFVideoPresenter)Activator.CreateInstance(type); 

       try 
       { 
        pRenderer = (MediaFoundation.EVR.IMFVideoRenderer)pEVR; 

        pRenderer.InitializeRenderer(null, pPresenter); 
       } 
       finally 
       { 
        //Marshal.ReleaseComObject(pPresenter); 
       } 
      } 

      // Continue with the rest of the set-up. 

      // Set the video window. 
      object o; 
      MediaFoundation.IMFGetService pGetService = null; 
      pGetService = (MediaFoundation.IMFGetService)pEVR; 
      pGetService.GetService(MediaFoundation.MFServices.MR_VIDEO_RENDER_SERVICE, typeof(MediaFoundation.EVR.IMFVideoDisplayControl).GUID, out o); 

      try 
      { 
       pDisplay = (MediaFoundation.EVR.IMFVideoDisplayControl)o; 
      } 
      catch 
      { 
       Marshal.ReleaseComObject(o); 
       throw; 
      } 

      try 
      { 
       // Set the number of streams. 
       pDisplay.SetVideoWindow(this.Handle); 

       if (dwStreams > 1) 
       { 
        pConfig = (MediaFoundation.EVR.IEVRFilterConfig)pEVR; 
        pConfig.SetNumberOfStreams(dwStreams); 
       } 

       // Set the display position to the entire window. 
       Rectangle r = this.ClientRectangle; 
       MediaFoundation.Misc.MFRect rc = new MediaFoundation.Misc.MFRect(r.Left, r.Top, r.Right, r.Bottom); 

       pDisplay.SetVideoPosition(null, rc); 

       // Return the IMFVideoDisplayControl pointer to the caller. 
       ppDisplay = pDisplay; 
      } 
      finally 
      { 
       //Marshal.ReleaseComObject(pDisplay); 
      } 
      m_pMixer = null; 
     }