그러냐

C#에서 DirectShow를 이용한 핀 연결하기 본문

c#

C#에서 DirectShow를 이용한 핀 연결하기

관절분리 2016. 1. 28. 11:35
반응형

원문 http://silk_tsubasa.blog.me/60102987344

 

너무 늦은 포스팅이네요. 논문을 끝내고 방학을 맞이하여 탱자탱자 놀다가 그만 한 학기 더 다니게 되었네요. 후훗

 

 

부모님 죄송하므니다 ㅠㅠㅠㅠㅠㅠㅠㅠ

 

 

핀 연결은 GraphEdit 에서는 자동연결 해주는 Null Rendering 이라던가 사용자가 직접 마우스로 핀을 연결 해 줄 수 있다.

 

하지만 무슨 이유에선지 File Source 필터라던지 몇몇 필터들은 Null Rendering 이 안되는 경우가 있다.

(심지어 GraphEdit 에서는 되는데 소스상 구현에선 안되는 경우도 있다.)

 

 

 

때문에 재생을 하려고 하면 그래프 생성, 필터 추가 까지 완벽하게 되었지만 화면엔 그저 검은 화면만이 자신을 놀리고 있는 것을 볼 수 있다.

 

 

하지만 방법이 없지는 않으리.

 

직접 In 핀과 Out 핀을 찾아서 손수 연결해주는 방법이 DirectShow 멀티미디어 프로그래밍(신화선님 저)에 실려있다.

물론 MFC 코드지만 나는 C#에서 사용해야 했기 때문에 부족한 실력이나마 C# 스타일로 고쳐보았다.

 

       /// <summary>
         /// 핀 연결 부분
        /// </summary>
        /// <param name="m_pGB">        해당 그래프</param>
        /// <param name="upFilter">      상위 필터   </param>
        /// <param name="downFilter"> 하위 필터   </param>
        private void ConnectFilter(IGraphBuilder m_pGB, IBaseFilter upFilter, IBaseFilter downFilter)
        {
            int hr = 1;
            int nMAX = 3;
            IEnumPins pUpEnumPins = null, pDownEnumPins = null;

            IPin[] ppinOut = new IPin[2], ppinIn = new IPin[2];
            IPin pDownstreamPin, pUpstreamPin;

            PinDirection direction;
            bool IsAnySucess = false;

            upFilter.EnumPins(out pUpEnumPins);
            int i = 0;
            while (pUpEnumPins.Next(1, ppinOut, IntPtr.Zero) == 0)
            {
                ppinOut[i].QueryDirection(out direction);

                if (direction == PinDirection.Output)
                {
                    ppinOut[i].ConnectedTo(out pDownstreamPin);

                    if (pDownstreamPin == null)
                    {
                        downFilter.EnumPins(out pDownEnumPins);

                        while (pDownEnumPins.Next(1, ppinIn, IntPtr.Zero) == 0)
                        {
                            ppinIn[i].QueryDirection(out direction);

                            if (direction == PinDirection.Input)
                            {
                                ppinIn[i].ConnectedTo(out pUpstreamPin);

                                if (pUpstreamPin == null)
                                {
                                    if (nMAX-- > 0)
                                    {
                                        hr = m_pGB.Connect(ppinOut[i], ppinIn[i]);
                                    }
                                    if (hr == 0)
                                        IsAnySucess |= true;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

(사실 이 부분은 DirectShow 멀티미디어 프로그래밍에 소개된 MFC 소스를 C#스타일에 끼워맞추면서

 파라미터 등을 DirectShow.NET 에 맞게 변경한 소스에 불과하다. 소스에 대한 궁금한 점은 신화선님의 책을 참고하길 바랍니다.)

 

각 필터들마다 저 엄청난 반복을 돌려줘야 하기 때문에 꽤 긴 지연시간을 예상했지만 실제 로스시간은 거의 느껴지지 않을 정도이다.

 

         /// <summary>
         /// 필터들을 연결
        /// </summary>
        private void ConnectFilters()
        {
            //Source Filter --> Video & Audio Filters
            ConnectFilter(m_Graph, m_sourceFilter, m_videoFilter);

            //Video Filter --> Video Renderer
            ConnectFilter(m_Graph, m_videoFilter, m_videoRender);

            if (m_type == 1)
            {
                ConnectFilter(m_Graph, m_sourceFilter, m_audioFilter);
                //Audio Filter --> Audio Renderer
                ConnectFilter(m_Graph, m_audioFilter, m_audioRender);
            }
        }

(위와 같은 방법으로 각 필터를 연결할 수 있다.)

 

 

 

오랜만에 학교 도서관에 와서 마우스도 없이 포스팅 하느라 그림도 없고 부실하기 짝이없지만 너그럽게 용서해 주시길 바랍니다.

 

나름 논문을 열심히 했으나 당시 스마트폰의 부재로 인한 하드웨어 기기의 한계로 화상채팅 프로그램이 매우 부족한 모습으로 완성되었지만,

칭찬해주신 교수님께 감사를 드리며, 궁금하신 점이 있으신 분들은 쪽지를 보내주세요.(아무도 물어보고 싶어 하진 않을 것 같지만...)

 

이만 마치겠습니다.

 

반응형

'c#' 카테고리의 다른 글

C# HttpWebRequest command to get directory listing  (0) 2016.01.28
DirectShow Stream Media 다루기  (0) 2016.01.28
C#에서 DirectShow를 다뤄보자.  (2) 2016.01.28
[c#] 시스템정보가져오기  (0) 2016.01.28
[c#]ip주소 mac주소 알아내기  (0) 2016.01.28