2014-09-12 8 views
0

Контекста

Я успешно загрузил 32 битную ezrgb24 COM (скомпилировано из образцов)Как подключить EZrgb24 фильтр к моей графе

Видео играет просто отлично с DirectShow.NET и C#.

Однако я не знаю, как подключить фильтр ezrgb24, который я создал к моему графику.

Добавлено в самого начало моего класса

[ComImport, 
System.Security.SuppressUnmanagedCodeSecurity, 
Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1"), 
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 

public interface IIPEffect 
{ 
    [PreserveSig] 
    void get_IPEffect([Out] out int effectNum, [Out] out double StartTime, [Out] out double Length); 

    [PreserveSig] 
    void put_IPEffect([In] int effectNum, [In] double StartTime, [In] double Length); 
} 

internal enum CLSCTX 
{ 
    Inproc = 0x03, 
    Server = 0x15, 
    All = 0x17, 
} 


[ComImport] 
[Guid("8B498501-1218-11CF-ADC4-00A0D100041B")] 
public class EZRGB24 
{ 

} 

Соответствующий код

 IBaseFilter ibfRenderer = null; 
     ISampleGrabber sampGrabber = null; 
     IBaseFilter capFilter = null; 
     IPin iPinInFilter = null; 
     IPin iPinOutFilter = null; 
     IPin iPinInDest = null; 



     Type comType = null; 
     object comObj = null; 

     m_FilterGraph = new FilterGraph() as IFilterGraph2; 

     try 
     { 
      // Get the SampleGrabber interface 
      sampGrabber = new SampleGrabber() as ISampleGrabber; 

      // Add the video source 
      hr = m_FilterGraph.AddSourceFilter(_videoPath, "Ds.NET FileFilter", out capFilter); 
      DsError.ThrowExceptionForHR(hr); 

      // Hopefully this will be the video pin 
      IPin iPinOutSource = DsFindPin.ByDirection(capFilter, PinDirection.Output, 0); 

      IBaseFilter baseGrabFlt = sampGrabber as IBaseFilter; 
      ConfigureSampleGrabber(sampGrabber); 

      iPinInFilter = DsFindPin.ByDirection(baseGrabFlt, PinDirection.Input, 0); 
      iPinOutFilter = DsFindPin.ByDirection(baseGrabFlt, PinDirection.Output, 0); 

      // Add the frame grabber to the graph 
      hr = m_FilterGraph.AddFilter(baseGrabFlt, "Ds.NET Grabber"); 
      DsError.ThrowExceptionForHR(hr); 

      hr = m_FilterGraph.Connect(iPinOutSource, iPinInFilter); 
      DsError.ThrowExceptionForHR(hr); 

      // Get the default video renderer 
      ibfRenderer = (IBaseFilter)new VideoRendererDefault(); 

      // Add it to the graph 
      hr = m_FilterGraph.AddFilter(ibfRenderer, "Ds.NET VideoRendererDefault"); 
      DsError.ThrowExceptionForHR(hr); 
      iPinInDest = DsFindPin.ByDirection(ibfRenderer, PinDirection.Input, 0); 

      // Connect the graph. Many other filters automatically get added here 
      hr = m_FilterGraph.Connect(iPinOutFilter, iPinInDest); 
      DsError.ThrowExceptionForHR(hr); 


      SaveSizeInfo(sampGrabber); 


      ----- everything works fine up to here. 

      IIPEffect myClass = (IIPEffect)(new EZRGB24()); 


      myClass.put_IPEffect(1008, 0, 100000); 


      hr = m_FilterGraph.AddFilter((IBaseFilter)myClass, "EZRGB24"); 

      IPin inPinx = DsFindPin.ByDirection((IBaseFilter)myClass, PinDirection.Input, 0); 
      m_FilterGraph.Connect(iPinOutSource, inPinx); 

      DsError.ThrowExceptionForHR(hr); 

Когда я мыши над MyClass, я могу видеть, что это не пустой.

Кроме того, я попытался подключить свой график с графическим редактированием, но моя программа не указана. Кроме того, hr равно 0 после этой строки hr = m_FilterGraph.AddFilter ((IBaseFilter) myClass, "EZRGB24");

Я использую directshow.net, однако это также помечено как directshow, так как я считаю, что решение будет работать либо для C#, либо для C++.

Это является продолжением моего предыдущего вопроса How to use EZrgb24 filter

+1

Вам необходимо прочитать о добавлении графика в ROT для проверки с помощью внешнего инструмента. Вам нужно понять, какой у вас график, поскольку он может отличаться от того, что вы ожидаете. Возможно, вы захотите использовать [DirectShowSpy] (http://alax.info/blog/1460) + GraphEdit/[GraphStudioNext] (https://code.google.com/p/graph-studio-next/) в качестве инструментов устранения неполадок , Выделите окно сообщения из своего кода в определенных точках и просмотрите графики, чтобы узнать, что вы получаете. –

+0

@RomanR. Спасибо Роман, я установлю эти инструменты. Но остается вопрос, как подключить фильтр к графику. В этом нет никакого примера. – Dave

+0

Методы в вашем фрагменте кода примерно правы: 'AddFilter',' Connect'. Я не вижу необходимости угадывать, что происходит не так, потому что информации слишком мало, а мощные инструменты еще не используются против этой проблемы. –

ответ

2

Вы используете iPinOutSource дважды для подключения. Во-первых вы выполняете:

// Hopefully this will be the video pin 
IPin iPinOutSource = DsFindPin.ByDirection(capFilter, PinDirection.Output, 0); 

hr = m_FilterGraph.Connect(iPinOutSource, iPinInFilter); 

и позже

m_FilterGraph.Connect(iPinOutSource, inPinx); 

ПИН-код может иметь только одно соединение.

+0

Делает смысл. Как я могу понять, что использовать контакты? Я не могу заставить редактировать график. Он падает, когда я подключаюсь к моему удаленному графику, а также я не вижу фильтр rgb24 в меню. Регистрируются как ezrgb24, так и proppage 32 и 64 – Dave

+0

Можете ли вы создать граф, который хотите, когда используете автономный графит? В основном, если вы хотите включить дополнительный фильтр C в график между фильтрами A и B, вы не должны подключать A к B, а от A до C, а затем от C до B. Всегда подключайтесь от начала до конца, что позволяет избежать некоторых проблем , – wimh

+0

Хорошо спасибо. Да, я могу создать график, но, как я уже сказал, я не вижу фильтр ezrgb24. – Dave