Directshow를 이용해서 Webcam으로 들어오는 영상을 뿌려주고 동영상으로 캡쳐하는 코드를 짜야했는데

DirectShow를 이해하는데 좀 어려웠다..ㅠ


DirectShow.Net의 library를 이용했다

(http://directshownet.sourceforge.net/)



(http://tramper2.blog.me/100061975292) 블로그에서 처음 기본적인 정보를 얻었다.

정독하지는 않았는데 그래서 더 시간이 오래 걸렸는지는 모르겠다.


며칠동안 이해하려고 해봣더니 DirectShow는

GraphEdit 프로그램을 써보는 것이 이해하는데 도움이 될거라는 말이 뭔말인지 알 것 같았다. 

graphedt.exe

graphstudionext64.exe

그래프에디터 실행화면 

웹캠 미리보기, 녹화를 하는 그래프 기본 구조(?)

이렇게 만들면 압축이 안 된 상태로 저장된다.



그래프와 필터라는 것이 있는데


그래프라는 것은 필터를 연결 시켜놓은 큰 그림을 말하는 것 같다.

필터라는 것은 각각의 COM Object 라는데 뭐 나는 COM Object를 알아서 동작하는 애들이라고만 이해했다


encoder, decoder, mux, demux, WebcamDevice.... 등등 이 전부 필터다 (위 사진에서 네모 박스들  Logitech HD Webcam c310, Smart Tee, ... 등)


Source 필터에서 시작해서 원하는 목적지까지 흘러가도록 그래프를 만들어야 하는데

중간에 코덱이라던지.. SmartTee.. Mux, 등등 알맞은 필터를 연결시켜야 제대로 동작하게 된다.


GraphEdit를 만지고 나서 그래프를 만들어봤다면


이제 이걸 코드로 바꾸기면 되는데


위의 블로그에 나와 있는 예에는 connect라던지.. 그런게 없고 ICaptureGraphBuilder2를 이용해서 PreView와 Capture Pin을 VideoRender필터와 FileWriter필터에 연결 시켜 동작하게 하는 코드인 것 같다.


블로그에 나온대로 Xvid 홈페이지에 가서 다운받고 따라해보려했지만 graphEdit에서도 xvid 인코더를 연결시키면 꺼지거나 중간필터를 찾을 수 없다고 뜨고.. c# 코드에서도 기본적으로 제공해주는 필터 외에 내가 설치한 필터를 어떻게 사용하는지 몰랐다 ㅠㅠ


compressor를 null로 놓으면 Raw(RGB24) 로 동영상을 캡쳐할 수 있긴 할 수 있었다. 하지만 인코딩을 하지 않았기 때문에 몇초만 캡쳐해도 용량이 어마어마했다 (초당 50~60MB)


어쨋든 구글 검색을 더하다가

(http://stackoverflow.com/questions/8213574/video-capture-output-always-in-320x240-despite-changing-resolution)

에서 해답을 얻었다.


Asf로 캡쳐를 하게 되면 인코딩이 가능한 것 같았다. 


답변에 따라 WPFMediaKit을 받고 실행하면 , 처음에는 무슨 동영상 재생하는 프로젝트로 기본이 되어있었던 것 같다.


App.xaml

<application 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:WPFMediaKit_DirectShow_Controls="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit" 
            x:class="SampleApplication.App" 
            Startupuri="WebCamPlayerWindow.xaml">
	

</application>


에서 StartupUri를 WebCamPlayerWindow.xaml로 바꿔주면 웹캠 프로젝트로 동작한다.


그리고 (http://www.codeproject.com/KB/audio-video/videosav.aspx)

 에서 프로젝트를 받고 WMLib.cs만 복사해서 WPFMediaKit 프로젝트의 VideoCapturePlayer.cs와 같은 폴더에 넣고 프로젝트에 추가한다.

hr = graphBuilder.SetOutputFileName(
                                    MediaSubType.Asf, 
                                    this.m_fileName, 
                                    out mux, 
                                    out sink);

IConfigAsfWriter lConfig = mux as IConfigAsfWriter;
hr = lConfig.ConfigureFilterUsingProfileGuid(WMData.WMProfile_V80_700NTSCVideo);
이러케 수정


하지만 나는 WinForm으로 만들고 있었기 때문에 WPFMediaKit 프로젝트에서 WinForm으로 돌릴 수 있게 바꾸는 과정이 있었다..ㅜ



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

C# 스텝 가이드  (0) 2015.05.27
C# 설정 저장하기  (0) 2014.11.27
C# 폴더 확인, 생성, 열기  (0) 2014.11.12
C# 커서 바꾸기  (0) 2014.11.12
[C#] TextBox에 숫자만 입력받기  (0) 2014.11.10
Posted by outshine90
,