지원되는 프로토콜

Media Foundation은 다음 프로토콜을 지원합니다.

  • RTSP(실시간 스트리밍 프로토콜)

    RTSP는 주로 미디어 콘텐츠를 스트리밍하는 데 사용됩니다. UDP 또는 TCP를 전송 프로토콜로 사용할 수 있습니다. UDP는 TCP 기반 프로토콜보다 대역폭 오버헤드가 적기 때문에 콘텐츠 배달에 가장 효율적입니다. TCP 프로토콜은 안정적인 패킷 배달을 보장하지만 TCP는 디지털 미디어 스트림에 적합하지 않습니다. 이 경우 대역폭을 효율적으로 사용하는 것이 가끔 손실되는 패킷보다 더 중요합니다.

  • HTTP(Hypertext Transfer Protocol)

    HTTP는 TCP를 사용하며 웹 서버에서 사용됩니다. "httpd://" 체계는 원본을 웹 서버에서 다운로드할 수 있음을 나타냅니다. HTTP는 일반적으로 HTTP 요청을 수락하고 일반적으로 다른 스트리밍 프로토콜을 거부하도록 구성된 방화벽의 경우에도 사용됩니다.

애플리케이션은 IMFNetSchemeHandlerConfig 인터페이스를 사용하여 Media Foundation에서 지원하는 프로토콜을 가져올 수 있습니다. 이렇게 하려면 애플리케이션은 먼저 IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols 를 호출하여 프로토콜 수를 검색한 다음 IMFNetSchemeHandlerConfig::GetSupportedProtocolType을 호출하여 인덱스를 기반으로 하는 프로토콜 형식을 가져와야 합니다. 이 메서드는 MFNETSOURCE_PROTOCOL_TYPE 열거형에 정의된 값 중 하나를 반환합니다.

또한 애플리케이션은 MFGetSupportedSchemes 함수를 호출하여 원본 확인자가 지원하는 체계를 가져올 수도 있습니다.

프로토콜 롤오버

애플리케이션이 "mms://"을 URL 체계로 지정하면 원본 확인자는 프로토콜 롤오버 작업을 수행합니다. 이 프로세스에서 원본 확인자는 콘텐츠를 가져오는 데 사용할 네트워크 원본에 가장 적합한 프로토콜을 결정합니다. 일반적으로 미디어 증기의 경우 RTSPU(UDP)를 사용하는 RTSP가 HTTP보다 더 효율적입니다. 그러나 콘텐츠가 웹 서버에서 호스트되는 경우 HTTP를 선택하는 것이 좋습니다.

프로토콜 롤오버는 URL 체계에 지정된 프로토콜을 사용하려는 시도가 실패할 때도 발생할 수 있습니다. 예를 들어 방화벽이 UDP 패킷을 차단할 때 프로토콜이 실패할 수 있습니다. 이 경우 원본 확인자는 HTTP로 전환됩니다.

URL 체계에 "rtspu://"과 같은 특정 프로토콜이 포함되어 있으면 프로토콜 롤오버가 적용되지 않습니다. 또한 인증에 실패하거나 서버가 클라이언트 연결 제한에 도달한 경우 롤오버가 수행되지 않습니다. 애플리케이션은 "mms://" 체계를 지정하고 원본 확인자가 시나리오에 가장 적합한 프로토콜을 선택할 수 있도록 하는 것이 좋습니다.

다음 표에는 롤오버 순서가 나와 있습니다.

스키마 허용 프로토콜 롤오버 순서
mms:// 또는 rtsp:// 빠른 캐시 사용:
  1. TCP를 사용하는 RTSP(RTSPT)
  2. RTSP(UDP 포함)
  3. HTTP 스트리밍
  4. HTTP 다운로드(HTTPD)
빠른 캐시 사용 안 함:
  1. Rtspu
  2. Rtspt
  3. HTTP 스트리밍
  4. HTTP 다운로드
Rtspu:// Rtspu
Rtspt:// Rtspt
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

현재 프로토콜 검색

프로토콜 롤오버 작업 후 네트워크 원본은 URL 체계에서 애플리케이션에서 지정한 프로토콜 이외의 프로토콜을 사용할 수 있습니다. 프로토콜 롤오버 결과는 네트워크 원본이 미디어 서버와의 연결을 설정한 후 애플리케이션에서 사용할 수 있습니다.

콘텐츠를 가져오는 데 사용되는 프로토콜 및 전송을 가져오기 위해 애플리케이션은 MFNETSOURCE_PROTOCOL 속성의 속성 값과 네트워크 원본에서 IPropertyStore 개체의 MFNETSOURCE_TRANSPORT 속성을 검색할 수 있습니다.

다음 코드는 이러한 값을 가져오는 방법을 보여줍니다.

// Create an IPropertyStore object.
    IPropertyStore *pProp = NULL;
    hr = CreatePropertyStore(&pProp);

    PROPVARIANT var;
    PropVariantInit(&var);

// Get the property store from the network source.
// The network source is created by the source resolver. Not shown.
    if (SUCCEEDED(hr))
    {
        hr = pNetworkSource->QueryInterface 
                (__uuidof(IPropertyStore), 
                (void**)&pProp);
    }
    if (SUCCEEDED(hr))
    {
        // Create a property key.
        PROPERTYKEY key;
        // Get the MFNETSOURCE_PROTOCOL property value.
        key.fmtid = MFNETSOURCE_PROTOCOL;
        hr = pProp->GetValue (key, &var);

        // Get the MFNETSOURCE_TRANSPORT property value.
        key.fmtid = MFNETSOURCE_TRANSPORT;
        key.pid = 0;
        hr = pProp->GetValue (key, &var);

    }

앞의 예제 코드에서 IPropertyStore::GetValue 는 MFNETSOURCE_PROTOCOL_TYPE 열거형의 멤버인 MFNETSOURCE_PROTOCOL 값을 검색합니다. MFNETSOURCE_TRANSPORT 경우 값은 MFNETSOURCE_TRANSPORT_TYPE 열거형의 멤버입니다.

또는 애플리케이션은 MFNETSOURCE_STATISTICS_SERVICE 서비스를 사용하여 동일한 값을 가져올 수 있습니다. 이 서비스를 사용하기 위해 애플리케이션은 MFGetService 함수를 호출하여 네트워크 원본에서 속성 저장소를 가져올 수 있습니다. 이 속성 저장소는 MFNETSOURCE_STATISTICS 속성에 네트워크 통계를 포함합니다. 프로토콜 및 전송 값은 MFNETSOURCE_STATISTICS_IDS 열거형에 정의된 MFNETSOURCE_PROTOCOL_ID 및 MFNETSOURCE_TRANSPORT_ID 지정하여 검색할 수 있습니다. 다음 코드는 MFNETSOURCE_STATISTICS_SERVICE 서비스를 사용하여 프로토콜 및 전송 값을 가져오는 방법을 보여줍니다.

// Create an IPropertyStore object.
    IPropertyStore *pProp = NULL;
    hr = CreatePropertyStore(&pProp);

    HRESULT hr = S_OK;

    hr = MFGetService(
        pMediaSource, 
        MFNETSOURCE_STATISTICS_SERVICE, 
        IID_IPropertyStore, 
        (void**) & pProp); 

    if (SUCCEEDED(hr))
    {
        // Create a property key.
        PROPERTYKEY key;
        // Get the property value.
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_PROTOCOL_ID;
        hr = pProp->GetValue (key, &var);

        // Get the transport value.
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_TRANSPORT_ID;
        hr = pProp->GetValue (key, &var);

    }

프로토콜 사용 및 사용 안 함

애플리케이션은 롤오버 프로세스 중에 특정 프로토콜을 건너뛰도록 네트워크 원본을 구성할 수 있습니다. 이를 위해 네트워크 원본 속성은 특정 프로토콜을 사용하지 않도록 설정하는 데 사용됩니다. 다음 표에서는 속성 및 해당 속성이 제어하는 프로토콜을 보여 줍니다.

속성 Description
MFNETSOURCE_ENABLE_HTTP HTTP 및 HTTPD를 사용하거나 사용하지 않도록 설정합니다.
MFNETSOURCE_ENABLE_RTSP RTSPU 및 RTSPT를 사용하거나 사용하지 않도록 설정합니다.
MFNETSOURCE_ENABLE_TCP RTSPT를 사용하거나 사용하지 않도록 설정합니다.
MFNETSOURCE_ENABLE_UDP RTSPU를 사용하거나 사용하지 않도록 설정합니다.
MFNETSOURCE_ENABLE_DOWNLOAD HTTPD를 사용하거나 사용하지 않도록 설정합니다.
MFNETSOURCE_ENABLE_STREAMING RTSPU, RTSPT 및 HTTP를 사용하거나 사용하지 않도록 설정합니다.

 

Media Foundation의 네트워킹