2016-06-03 27 views
0

Situation:Kein Video bei Verwendung des erweiterten Video-Renderers

Erstellen eines Entschlüsselungsfilters mit directshow. Die Grafik ist DecryptFileSource -> GdCl Mpeg-4 Demux -> ffdshow Video Decoder -> Enhanced Video Renderer

Ausgabe:

  • GraphEdit: Das Video zeigt, arbeitet in Ordnung.
  • GraphStudioNext: zeigt die Video, funktioniert in Ordnung.
  • GraphEditPlus: Zeigt das Video nicht, funktioniert nicht arbeiten.
  • Durch Code: Funktioniert auch nicht. Allerdings, wenn ich die EVR mit „Video Renderer“ oder „VMR9“

Ein anderer Benutzer ersetzen hatte dieses Problem here jedoch seine Antwort vage war. Laut Roman (in den Kommentaren zum vorherigen Link) erfordert es eine spezifische Initialisierung. Ich bin mir jedoch nicht sicher, wie ich es speziell initialisieren soll.

Keine Fehler werden ausgelöst, wenn ich versuche, das Diagramm über Code zu erstellen. Ich habe eine Suche aktiviert und ich kann sehen, dass die IMediaPosition funktioniert. Nur kein Video wird angezeigt, aber die Audio-Wiedergabe

Antwort

0

Ich fand die Antwort.

  1. Compile EVRPresenter.dll gefunden in "Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Samples \ Multimedia \ MediaFoundation \ EVRPresenter"

  2. die DLL "regsvr32 EVRPresenter.dll" Install

  3. Kompilieren Sie und fügen Sie die MediaFoundation.dll in mein Produkt ein. Link here

  4. Anstatt das Objekt zu schaffen, wie ich normalerweise

wie folgt tun:

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

statt

 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; 
     }