그러냐

DirectShow Stream Media 다루기 본문

c#

DirectShow Stream Media 다루기

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

WPF와는 직접적인 연관이 있는것은 아니지만 이쪽일을 하다보면 미디어 관련 작업을 해야하는 경우가 있는데 DirectShow 를 써야하는 경우가 생긴다. 그런데 DirectShow 라는 놈은 원래 DirectX 와 함께 나오던 기술로서 근래에 들어서야 분리되어 Windows SDK 쪽으로 붙어서 나오게 되었다. 그런데 이놈은 Unmanaged C++ 형태이다. 그러나 우리(?)가 누구인가!!! 용자(?)들이 뭉쳐서 바로DirectShowNET Library 를 구현하였으니 (실지로는 Interop 을 이용한 랩핑) .NET 에서도 DirectShow 작업을 편리하게 할 수 있다. 말 그래로 정말 편리한데 SDK 에서 제공하는 C++ 로 된 예제들 까지 전부 .NET(C#) 으로 고쳐주셨으니 그져 감개 무량할 따름이다.


그러나...


 

일단 이놈을 이용해서 자신의 Local Computer 에 저장된 미디어를 재생하려면 .\Samples\Players\PlayWnd 쪽 코드만 보면 웬만해서는 상황끝... 하지만 mms:// 서버 기반의 Stream Media 를 재생하려면... 이야기가 달라진다. PlayWnd 의 코드만으로는 작동되지 않는다.


 

모두들 Copy & Paste 할 코드만 찾을 것인가? ... 하긴 DirectShow 라는 놈을, PlayWnd 라는 놈을 본게 처음이라면 이해가 가기는 하나 제발 생각해 보자...


 

이 주제에 대해서 Google Groups 에 이야기가 올라와 있다. 대부분 정답 코드가 없으면 그냥 지나치겠지... 하지만 난 여기서 해결책을 찾아 냈다.


 

You can think of IGraphBuilder::RendeFile() as performing the following actions:

1. IGraphBuilder::AddSourceFilter()

2. IFileSourceFilter::Load()

3. for each output pin (IBaseFilter::EnumPins()), call 
IGraphBuilder::Render()



 

Given the default registry settings, AddSourceFilter() will 
choose either the WMASFReader or the old WMSourceFilter, 
depending on the version of DirectShow and WMF.

If you don't like the choice made by AddSourceFilter(), 
substitute step #1 with CoCreateInstance(CLSID_<filter>) and 
IGraphBuilder::AddFilter(), but then you need to perform 
steps #2 and #3 yourself.


 

감이 오는가 ??? 여전히 Copy & Paste 할 코드만 찾는 당신에게 나는 그걸 제공하고 싶지는 않다. 다만 단계별 코드 조각을 여기 나열할테니 참고하여 완성시켜 보기 바란다.


 

1)

this.srcFilter = (IBaseFilter)new WMAsfReader();
graphBuilder.AddFilter(srcFilter, "ASF Reader");


 

2)

this.srcReader = (IFileSourceFilter)this.srcFilter;
srcReader.Load(filename, null);


 

3)

srcFilter.EnumPins(out srcPins);
while (0 == srcPins.Next(1, srcPin, (IntPtr)null))
{
  hr = this.graphBuilder.Render(srcPin[0]);
}


 

Finally : Do Your Self !~



반응형