DirectShow DirectShow 샘플 필터 샘플 DSNetwork 필터 샘플 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
설명
DSNetwork 샘플은, MPEG-2 트랜스포트 스트림을 멀티 캐스트 하는 방법을 나타낸다. 다음의 2 개의 관련 필터가 포함된다.
어느 쪽의 필터도, 멀티 캐스트 주소 및 Network Interface Card (NIC) 주소를 설정하는, 커스텀 인터페이스의 IMulticastConfig 를 지원 하고 있다.
패스
소스 : (SDK 루트) \Samples\C++\DirectShow\Filters\DSNetwork
사용자 가이드
이 샘플을 사용하려면 , Visual Studio 프로젝트를 컴파일 해 생성 한다. Filter\Debug 서브 디렉토리 또는 Filter\Release 서브 디렉토리에, dsnet.ax 라고 하는 DLL 가 생성 된다. Regsvr32 유틸리티를 사용해 DLL 를 등록한다.
푸쉬 모드에서는, MPEG-2 트랜스포트 스트림이 필요하다. 이것은, 디지털 TV 튜너, IEEE 1394 MPEG-2 캠 코다 등, MPEG-2 트랜스포트 스트림 (파일 소스 이외)을 출력하는 것이면 뭐든지 상관없다. 그래프는, 송신용 그래프와 수신용 그래프의, 2 개의 그래프가 필요하다.
필터는 GraphEdit 로 다음과 같이 테스트할 수 있다.
소스가 네트워크 프로바이더의 경우, 그래프는 TIF 필터를 가지고 있지 않으면 안 된다. 인피닛트핀티필터를 사용해 트랜스포트 스트림을 분할해, 1 개의 스트림을 (MPEG-2 디멀티플렉서를 통해서) TIF 에 송신해, 이제 1 개의 스트림을 Multicast Sender 에 송신한다.
애플리케이션은,IMulticastConfig 인터페이스를 사용해, Multicast Sender 필터 및 Multicast Receiver 필터를 구성할 필요가 있다. 어느 쪽의 필터도 이 인터페이스를 공개한다.
IMulticastConfig::SetMulticastGroup 를 호출해, 멀티 캐스트 주소 및 포트 번호를 설정한다. 어느 쪽의 수치도 네트워크 바이트순서가 아니면 안된다. Windows Sockets 라이브러리에는, 그러한 수치를 올바른 바이트순서로 변환하기 위한 헬퍼-함수가 있다. 예를 들어, 다음 코드는 멀티 캐스트 주소 235.1. 1.1, 포트 번호 5000 의 필터를 구성한다.
// IP 주소.
const char ip_address[] = "235.1. 1.1";
unsigned long ulIP = inet_addr(ip_address);
if (ulIP == INADDR_NONE)
{
cout << "Invalid IP address: " << ip_address << "\n";
return;
}
// 포트 번호.
unsigned short usPort = htons(5000);
hr = pConfig->SetMulticastGroup(ulIP, usPort);
if (FAILED(hr))
{
cout << "SetMulticastGroup failed\n";
return;
}
inet_addr 함수로 "닷 표기" 캐릭터 라인이 네트워크 바이트순서에 변환되어htons 함수로 포트 번호 (부호 없음 Short 형으로 나타낸다)가 변환된다.
다음에,IMulticastConfig::SetNetworkInterface 를 호출해, Network Interface Card (NIC) 주소를 지정한다. Windows Sockets 라이브러리를 사용해, 사용자의 시스템으로 유효한 NIC 주소의 일람을 얻어올 필요가 있다. 최초로, DSNetwork 샘플로 정의된 CInterface 클래스를 사용할 수 있다. 다음의 예에서는, 이 클래스를 사용해 NIC 주소를 얻어온다.
CInterface NIC;
hr = NIC.Initialize();
if (FAILED(hr))
{
cout << "Could not initialize the NIC helper class\n";
return;
}
// 리스트의 최초의 NIC 주소를 사용한다.
unsigned long ulNIC = NIC[0]->iiAddress.AddressIn.sin_addr.S_un.S_addr;
hr = pConfig->SetNetworkInterface(ulNIC);
if (FAILED(hr))
{
cout << "SetNetworkInterface failed: " << ulNIC << "\n";
return;
}
수신용 그래프로 MPEG-2 디멀티플렉서 필터를 구성하는 방법에 대해서는, 「MPEG-2 디멀티플렉서의 사용법」을 참조할것.
참조