스트리밍 미디어 처리는 복잡성과 기술성으로 인해 항상 업계의 폭넓은 관심을 받아왔습니다. 특히, 인터넷의 대중화와 함께 스트리밍 미디어가 인터넷에서 널리 사용되고 있으며, 스트리밍 미디어를 어떻게 간단하고 효율적으로 처리할 것인가가 점차 주목받고 있습니다. 적합한 응용 솔루션을 선택하면 절반의 노력으로 두 배의 결과를 얻을 수 있습니다. 이때 Microsoft의 DirectShow가 우리에게 좋은 선택을 제공합니다.
DirectShow는 Windows용 ActiveMovie 및 Video를 기반으로 Microsoft에서 출시한 차세대 COM 기반 스트리밍 미디어 처리 개발 키트입니다. 현재 DirectX의 최신 버전은 9.0입니다. DirectShow는 멀티미디어 스트림의 캡처 및 재생을 강력하게 지원합니다. DirectShow를 사용하면 WDM 드라이버 모델을 지원하는 캡처 카드에서 데이터를 쉽게 캡처하고 해당 후처리를 수행하며 파일에 저장할 수도 있습니다. 이는 멀티미디어 데이터베이스 관리 시스템(MDBMS)의 멀티미디어 데이터에 대한 액세스를 더욱 편리하게 만듭니다.
DirectShow 원리 및 중요 인터페이스
1. DirectShow 작동 원리
1) DirectShow 시스템 구조
DirectShow 시스템 구조는 다음과 같습니다. 그림 1에 나와 있습니다.
그림 1 DirectShow 시스템
DirectShow는 애플리케이션 계층에 있습니다. 필터 그래프라는 모델을 사용하여 전체 데이터 흐름 처리 프로세스를 관리합니다. 데이터 처리에 관련된 각 기능 모듈을 필터라고 합니다. 각 필터는 필터 그래프에서 특정 순서로 연결되어 함께 작동합니다. 필터는 기능에 따라 크게 소스 필터, 변환 필터, 렌더링 필터의 세 가지 범주로 나뉩니다. 소스 필터는 주로 데이터 획득을 담당합니다. 데이터 소스는 파일, 인터넷 또는 컴퓨터, 디지털 카메라 등의 캡처 카드일 수 있으며, 변환 필터는 주로 형식 변환 및 전송을 담당합니다. 데이터; 렌더링 필터는 주로 데이터를 담당합니다. 최종 목적지에서는 멀티미디어 시연을 위해 데이터를 사운드 카드와 그래픽 카드로 보내거나 저장을 위해 파일로 출력할 수 있습니다.
DirectShow 시스템에서 우리가 보는 것은 우리의 애플리케이션(Application)입니다. 애플리케이션은 특정 의도에 따라 해당 필터 그래프를 구축한 후 필터 그래프 관리자를 통해 전체 데이터 처리 과정을 제어해야 합니다. DirectShow는 필터 그래프가 실행 중일 때 다양한 이벤트를 수신하고 메시지를 통해 애플리케이션에 보낼 수 있습니다. 이러한 방식으로 응용 프로그램과 DirectShow 시스템 간의 상호 작용이 이루어집니다.
2) 필터 개요 및 연결
필터는 DirectShow의 가장 기본적인 개념입니다. DirectShow는 필터 그래프를 통해 필터를 관리합니다. 필터 그래프는 필터의 "컨테이너"이며, 필터는 필터 그래프에서 가장 작은 기능 모듈입니다. 필터는 COM 구성 요소입니다. 각 필터에는 필터에 의해 생성된 COM 개체인 자체 핀이 있습니다. 필터는 핀을 통해 연결합니다. 핀은 출력 핀과 입력 핀의 두 가지 유형으로 구분됩니다.
출력 핀은 필터에서 처리된 데이터를 필터 외부로 전달하고, 입력 핀은 필터 외부의 데이터를 필터 내부로 전달받아 필터가 데이터를 처리할 수 있도록 합니다. 세 가지 유형의 필터(소스 필터, 변환 필터, 렌더링 필터)에 대한 연결 다이어그램은 다음과 같습니다.
그림 2 필터 연결
2. DirectShow 하드웨어 지원 원리
p>
우리 모두 알고 있듯이 시스템 안정성을 향상시키기 위해 Windows 운영 체제는 하드웨어 작업을 격리합니다. 일반적으로 응용 프로그램은 하드웨어에 직접 액세스할 수 없습니다. DirectShow 필터는 사용자 모드(사용자 모드, 운영 체제 권한 수준은 링 3)에서 작동하는 반면, 하드웨어는 커널 모드(커널 모드, 운영 체제 권한 수준은 링 0)에서 작동합니다. DirectShow의 솔루션은 이러한 하드웨어에 대한 패키징 필터를 설계하는 것입니다. 이러한 종류의 필터는 사용자 모드에서 작동할 수 있으며 모양과 제어 방법은 일반 필터와 동일하며 패키징 필터는 내부적으로 하드웨어 드라이버와의 상호 작용을 완료합니다. 이 디자인은 DirectShow 응용 프로그램을 작성하는 개발자가 하드웨어 지원에 필요한 특수 처리 과정을 거치지 않도록 해줍니다. DirectShow에는 오디오 캡처 필터(qcap.dll), VfW 캡처 필터(qcap.dll, 필터의 클래스 ID는 CLSID_VfwCapture), TV 튜너 필터(KSTVTune.ax, 필터의 클래스 ID는 CLSID_CTVTunerFilter), 아날로그 비디오 크로스바 필터를 포함한 통합 패키징 필터가 있습니다. (ksxbar.ax), TV 오디오 필터(필터의 클래스 ID는 CLSID_TVAudioFilter) 등 또한 DirectShow는 WDM 드라이버를 사용하는 하드웨어용 KsProxy 필터(Ksproxy.ax)를 설계했습니다. 다음 그림은 각 패키지 필터와 하드웨어 간의 상호 작용에 대한 구조 다이어그램입니다.
응용 프로그램 DirectShow 필터 GraphKsTune.axKsXbar.axKsCap.ax 기타 일반 FilterStream ClassTuner minidriverCrossbar mindriverCapture minidriverTuner, Crossbar, Capture 미니 드라이버
3. DirectShow의 중요한 인터페이스
DirectShow는 COM 표준을 채택하므로 많은 중요한 기능이 COM 인터페이스를 통해 완성됩니다. 다음은 몇 가지 중요한 DirectShow 인터페이스입니다.
(1) IGraphBuilder 인터페이스
필터 그래프를 구성하고, 일련의 필터를 설정 및 관리하고, 소스 미디어 스트림을 필터링 및 처리하는 데 사용되는 인터페이스입니다.
(2) IMediaControl 인터페이스
필터 차트에서 스트림 시작 및 중지 등 멀티미디어 스트림의 흐름을 제어하는 데 사용됩니다.
(3) IMediaEvent 인터페이스
재생 중에 발생하는 이벤트를 캡처하고 EC_COMPLETE 등과 같은 애플리케이션에 알리는 데 사용됩니다.
(4) IVideoWindow 인터페이스
비디오 창의 속성을 제어하는 데 사용됩니다.
(5) IMeadiaSeeking 인터페이스
미디어를 찾고, 스트리밍 미디어를 찾고, 멀티미디어 데이터 재생을 제어하여 정확한 제어를 제공하는 데 사용되는 인터페이스입니다.
(6) IBaseFilter 인터페이스
ImediaFilter 인터페이스에서 상속되며 특정 필터 포인터를 정의하고 멀티미디어 데이터를 처리하는 데 사용됩니다.
(7) IPin 인터페이스
필터를 연결하기 위해 두 필터 사이의 Pin을 관리하는 데 사용됩니다.
(8) IsampleGrabberCB 인터페이스
Sample Grabber 필터의 인터페이스로, 스트리밍 미디어 데이터가 필터를 통과하여 프레임 이미지를 얻을 때 샘플링하는 데 사용됩니다.
DirectShow와 함께 카메라를 사용하려면 일반적으로 카메라 드라이버가 WDM 형식이어야 합니다. 물론 일부 이전 드라이버 형식도 DirectShow를 지원할 수 있습니다. DirectShow에는 스트림에 삽입할 수 있는 필터인 Sample Grabber 필터가 있으며, 이는 샘플을 저장하는 자체 버퍼를 가지고 있습니다. 이를 사용하여 비디오 파일에서 프레임을 간단히 캡처할 수 있습니다. DirectShow는 필터 그래프 관리자를 통해 상위 계층 응용 프로그램 및 하위 계층 드라이버와 통신합니다. DirectShow는 캡처 필터를 통한 카메라 캡처를 지원합니다. 캡처 필터에는 여러 개의 소켓(핀)이 있으며 미리 보기 소켓을 사용하여 이미지를 표시할 수 있습니다.
1. 그래프 필터 관리자 필터 그래프 생성
위 원칙에서 언급했듯이 먼저 필터 그래프를 생성해야 합니다:
CComPtr
p>
hr=m_pGraph.CoCreateInstance(CLSID_FilterGraph)
2. 장치를 연결합니다.
또한 시스템 열거자 구성 요소 개체를 만듭니다. /p>
CComPtr
그런 다음 CreateClassEnumerator() 인터페이스 메서드를 사용하여 지정된 필터 등록 유형 디렉터리에 대한 열거자를 만들고 IenumMoniker 인터페이스를 얻습니다. :
CComPtr
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, amp; pEm, 0)
그런 다음 BindToObject()를 호출한 후 장치 식별자는 DirectShow 필터로 생성되어 필터 그래프에 추가되고 작업에 참여할 수 있습니다.
CComPtr < IMoniker > pM;
CComPtr < IPropertyBag > pBag
hr=pM->BindToStorage(0, 0, ID_IPropertyBag, (void** ) amp; pBag );
3. 샘플 그래버 필터 생성
CComPtr < ISampleGrabber > m_pGrabber
hr=m_pGrabber.CoCreateInstance( CLSID_SampleGrabber ); >
p>
SampleGrabber를 생성한 후 다른 필터에 연결하기 전에 Sample Grabber 필터를 구성해야 합니다. 그런 다음 IsampleGrabber 인터페이스를 쿼리하고 스트리밍 미디어 유형을 설정합니다.
m_pGrabber->SetMediaType()
기본 미디어 유형과 하위 유형만 지정할 수 있습니다. 기본 유형, 하위 유형 및 유형 형식. 그런 다음 FilterGraph에 로드합니다.
m_pGraph->AddFilter(pGrabBase, "Grabber" )
4. 필터 그래프의 핀을 찾아 연결을 완료합니다.
다음으로, IGraphBuilder의 FindPin() 인터페이스를 호출하여 필터 관리자에서 Pin 인터페이스를 찾고, ICaptureGraphBuilder2의 RenderStream() 인터페이스를 통해 후속 연결을 완료할 수 있습니다.
hr=pCGB2->FindPin(pCap, PINDIR_OUTPUT, amp; PIN_CATEGORY_VIDEOPORT, NULL, FALSE, 0, amp; pVPPin)
hr=pCGB2->RenderStream(amp; PIN_CATEGORY_CAPTURE) , MEDIATYPE_Video, pCap, pGrabBase, pRenderer)
5. 스트리밍 미디어 유형을 가져와 실행합니다.
GetConnectedMediaType()을 통해 연결된 스트리밍 미디어 유형을 가져온 후 IsampleGrabberCB를 사용할 수 있습니다. 클래스의 BufferCB() 인터페이스를 사용하여 비디오 데이터를 사용자 정의 버퍼에 복사한 다음 버퍼에 복사를 통해 비디오를 이미지 데이터로 복사합니다. 최종 실행:
CComQIPtr
hr = pControl->Run()
결론
< p>이 문서에서는 DirectShow의 기본 원리, 필터 그래프를 생성하는 기본 방법, DirectShow를 통해 비디오 데이터를 캡처한 후 원하는 이미지로 저장하는 방법에 대해 설명합니다. 멀티미디어 데이터베이스 관리 시스템에 매우 유용한 보충 자료입니다. 시험 등록을 위한 소프트웨어 시스템은 적응성이 뛰어나 개발 비용을 줄일 수 있습니다. 사용자 유용성을 향상시킵니다.DirectShow 기술은 멀티미디어 개발을 위한 입증된 방법입니다. 향후 몇 년 동안 DirectShow 기술의 개발 전망은 매우 광범위하며 DirectShow 기술을 마스터하는 것은 중요한 실제적 의미를 갖습니다.