サポートされるプロトコル

Media Foundation では、次のプロトコルがサポートされています。

  • リアルタイム ストリーミング プロトコル (RTSP)

    RTSP は主にメディア コンテンツのストリーミングに使用されます。 トランスポート プロトコルとして UDP または TCP を使用できます。 UDP は、TCP ベースのプロトコルよりも帯域幅のオーバーヘッドが小さいため、コンテンツ配信に最も効率的です。 TCP プロトコルは信頼性の高いパケット配信を保証しますが、TCP はデジタル メディア ストリームには適していません。帯域幅の効率的な使用は、時折失われるパケットよりも重要です。

  • ハイパーテキスト転送プロトコル (HTTP)

    HTTP は TCP を使用し、Web サーバーによって使用されます。 "httpd://" スキームは、ソースが Web サーバーからダウンロード可能であることを示します。 HTTP は、通常は HTTP 要求を受け入れ、通常は他のストリーミング プロトコルを拒否するように構成されるファイアウォールの場合にも使用されます。

アプリケーションは、 IMFNetSchemeHandlerConfig インターフェイスを使用して、Media Foundation でサポートされているプロトコルを取得できます。 これを行うには、まず IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols を呼び出してプロトコルの数を取得し、 IMFNetSchemeHandlerConfig::GetSupportedProtocolType を呼び出してインデックスに基づいてプロトコルの種類を取得する必要があります。 このメソッドは、 MFNETSOURCE_PROTOCOL_TYPE 列挙で定義されている値のいずれかを返します。

アプリケーションは、 MFGetSupportedSchemes 関数を呼び出すことによって、ソース リゾルバーでサポートされているスキームを取得することもできます。

プロトコル ロールオーバー

アプリケーションが URL スキームとして "mms://" を指定すると、ソース リゾルバーは プロトコル ロールオーバー 操作を実行します。 このプロセスでは、ソース リゾルバーによって、コンテンツの取得に使用するネットワーク ソースに最適なプロトコルが決定されます。 通常、メディア スチーミングの場合、UDP (RTSPU) を使用した RTSP は HTTP よりも効率的です。 ただし、コンテンツが Web サーバーでホストされている場合は、HTTP を使用することをお勧めします。

プロトコル ロールオーバーは、URL スキームで指定されたプロトコルの使用が失敗した場合にも発生する可能性があります。 たとえば、ファイアウォールが UDP パケットをブロックすると、プロトコルが失敗する可能性があります。 この場合、ソース リゾルバーは HTTP に切り替えます。

URL スキームに "rtspu://" などの特定のプロトコルが含まれている場合、プロトコル ロールオーバーは適用されません。 また、認証に失敗した場合、またはサーバーがクライアント接続の制限に達した場合、ロールオーバーは実行されません。 アプリケーションで "mms://" スキームを指定し、ソース リゾルバーがシナリオに最適なプロトコルを選択できるようにすることをお勧めします。

次の表に、ロールオーバーの順序を示します。

許可されるスキーム プロトコルのロールオーバー順序
mms:// または rtsp:// 高速キャッシュが有効:
  1. TCP を使用した RTSP (RTSPT)
  2. UDP を使用した RTSP (RTSPU)
  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 スキームでアプリケーションによって指定されたプロトコル以外のプロトコルを使用する場合があります。 プロトコル ロールオーバーの結果は、ネットワーク ソースがメディア サーバーとの接続を確立した後にアプリケーションで使用できます。

コンテンツの取得に使用されるプロトコルとトランスポートを取得するために、アプリケーションはネットワーク ソースから IPropertyStore オブジェクトの MFNETSOURCE_PROTOCOL プロパティと 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 でのネットワーク