일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- php 시큐어코딩
- WebView
- FCM
- 자동 생성
- PHP
- html5
- Android
- 자바스크립트
- 안드로이드 gcm
- 우분투
- not working
- android 효과음
- 폼메일
- C# IO
- UML
- C#
- roundcube
- 안드로이드 푸쉬
- php 취약점
- soundpool
- dovecot
- xe
- 설치
- 안드로이드 푸시
- 안드로이드
- Mail Server
- curl
- chart.js
- javascript
- mysql
- Today
- Total
그러냐
C#에서 DirectShow를 다뤄보자. 본문
http://silk_tsubasa.blog.me/60090566446
두번째이자 마지막 포스팅이 될 DirectShow 관련 공부이다.
C#에서 DirectShow를 사용하려고 보니. 아뿔싸. MFC 언어가 잔뜩 있는게 아닌가.
DLLImport 도 모르는 나는 할 수 없이 C#용 DirectShow 를 구할 수 밖에 없었다.
그거슨 바로...
http://sourceforge.net/projects/directshownet/
정체불명(?)의 개발자들이 모여사는 sourceforge(http://sourceforge.net)의 DirectShow .NET 프로젝트 팀이
만든 .NET용 DirectShow 라이브러리이다.
다운로드를 하면 DirectShowLib-2005.dll 파일을 구할 수 있다.
원하는 프로젝트의 Reference 에 추가하도록 하자.
그리고 using 을 걸어주면 된다.
using DirectShowLib;
자 그럼 이제 DirectShow 를 사용할 준비는 끝이 났다.
기본적인 렌더링이라던가 캡쳐디바이스들을 사용하는 것은 인터넷에 많이 있다.
그럼 이번엔 지난번 본 MP4 포맷인 .skm 파일을 재생하기 위한 필터를 추가하는 방법을 알아보자.
일반적인 방법으로 MP4 포맷 영상을 재생하려하면 아무것도 출력되지 않고 바로 종료되는데 이는 GraphEdit 때와 마찬가지로
널 렌더링(NULL Rendering)의 방식으로는 재생할 수 없기 때문이다. ( MP4 포맷을 출력 할 수 있는 좋은 필터가 있다면, 바로 재생될 수도 있다. )
그렇다면 이전에 공부한 방법처럼 직접 필터들을 그래프에 추가하고 직접 Pin 들을 연결해주면 재생할 수 있을 것 같아서
사용할 필터들의 객체를 만들어 보기로 했다.
우선적으로 필요한 것은 해당 필터들의 CLSID 그리고 DisplayName 이다.
위의 파란 부분이 바로 필터의 종류( DirectShowFilters 등)를 나타내는 CLSID 이고 붉은 부분이 DisplayName 이다.
이제 직접 Gretech MP4 Source Filter 의 객체를 생성해 보자.
IBaseFilter m_filter_Gretech_MP4_Source_Filter = null;
Guid m_guid_Direct_Show_Filters_CLSID = new Guid(0x083863f1, 0x70de, 0x11d0, 0xbd, 0x40, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
string m_string_Gretech_MP4_Source_Filter_DisplayName =
"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\\{D18284FE-DE51-4F33-A9BB-A8D3AE4B66BB}";
( 변수명이 너무 조잡하지만 ㅠㅠ.. 실력이 부족한 탓이니 이해하시길..)
m_filter_Gretech_MP4_Source_Filter = DS_SetupSourceFilter(m_guid_Direct_Show_Filters_CLSID,
m_string_Gretech_MP4_Source_Filter_DisplayName);
// DirectShow 멀티미디어 프로그래밍 ( 신화선 저 ) 의 소스를 참고하여 따라해 보았다.
private IBaseFilter DS_SetupSourceFilter(Guid FilterCLSID, string DisplayName)
{
object source = null;
IMoniker[] pMoniker = new IMoniker[1];
IEnumMoniker pEnumCat = null;
ICreateDevEnum pCreateDevEnum = (ICreateDevEnum)new CreateDevEnum();
pCreateDevEnum.CreateClassEnumerator(FilterCLSID, out pEnumCat, 0);//<- CLSID로 해당하는 필터들을 모두 검색해서
int i = 0;
while (pEnumCat.Next(1, pMoniker, IntPtr.Zero) == 0)
{
string dname;
pMoniker[i].GetDisplayName(null, null, out dname);
if (dname.CompareTo(DisplayName) == 0)//<- DisplayName 과 정확히 일치하는 녀석을 IBaseFilter 로 반환
{
Guid iid = typeof(IBaseFilter).GUID;
pMoniker[i].BindToObject(null, null, ref iid, out source);
break;
}
}
return (IBaseFilter)source;
}
이제 m_filter_Gretech_MP4_Source_Filter 녀석은 실제 Gretech MP4 Source Filter 로 사용할 수 있다.
그런데 SourceFilter 들은 파일을 연결시켜 주지 않으면 사용 할 수가 없으니 이제 파일을 연결해 보도록 하자
// 이 소스 역시 위 책을 참고하였다.
IFileSourceFilter pFSF;
pFSF = (IFileSourceFilter)m_filter_Gretech_MP4_Source_Filter;
if (pFSF != null)
pFSF.Load("C:\\test.skm", null);
이제 소스필터의 객체를 만들고 파일을 연결하는 것 까지는 성공했다.
위와 같은 방식으로 ( 파일 연결은 제외 ) 다른 사용할 필터들을 모두 추가해준 뒤 그래프에 AddFilter 함수로 넣어줄 수 있다.
m_filter_Gretech_MP4_Source_Filter
m_filter_Gretech_Video_Filter
m_filter_Gretech_Audio_Filter
m_filter_AC3_Filter
m_filter_Video_Renderer
m_filter_Audio_Renderer
총 여섯개의 필터를 생성 할 수 있다.
이제 위 필터들을 Graph 에 추가해 줘야 한다.
m_graph_Play_Graph = (IGraphBuilder)new FilterGraph();
m_graph_Play_Graph.AddFilter(m_filter_Gretech_MP4_Source_Filter, "Gretech MP4 Source Filter");
m_graph_Play_Graph.AddFilter(m_filter_Gretech_Video_Filter, "Gretech Video Filter");
m_graph_Play_Graph.AddFilter(m_filter_Gretech_Audio_Filter, "Gretech Audio Filter");
m_graph_Play_Graph.AddFilter(m_filter_AC3_Filter, "AC3 Filter");
m_graph_Play_Graph.AddFilter(m_filter_Video_Renderer, "Video Renderer");
m_graph_Play_Graph.AddFilter(m_filter_Audio_Renderer, "Audio Renderer");
여기까지가 그래프에 원하는 필터를 직접적으로 추가하는 방법이다.
Pin 연결이 남아 있기 때문에 아직 재생은 되지 않는다.
Pin 연결 역시 무슨 수를 써도 알아서 연결을 하지 않길래 직접 핀을 하나씩 원하는 필터끼리 연결해줘야 했다.
(무슨 방법이 있을지도 모른다. 그렇다면 지금까지의 내 행동은 모두 ... )
그건 다음에 마지막으로 한번 더 쓰도록 하겠다.
'c#' 카테고리의 다른 글
DirectShow Stream Media 다루기 (0) | 2016.01.28 |
---|---|
C#에서 DirectShow를 이용한 핀 연결하기 (0) | 2016.01.28 |
[c#] 시스템정보가져오기 (0) | 2016.01.28 |
[c#]ip주소 mac주소 알아내기 (0) | 2016.01.28 |
[C#]CSV파일 읽어 처리하는 방법 (0) | 2016.01.28 |