Protocolli supportati

Media Foundation supporta i protocolli seguenti:

  • RtSP (Real Time Streaming Protocol)

    RTSP viene usato principalmente per lo streaming di contenuti multimediali. Può usare UDP o TCP come protocolli di trasporto. UDP è il più efficiente per la distribuzione di contenuti perché il sovraccarico della larghezza di banda è minore di quello con i protocolli basati su TCP. Anche se il protocollo TCP garantisce un recapito affidabile dei pacchetti, TCP non è adatto per i flussi multimediali digitali, in cui l'uso efficiente della larghezza di banda è più importante rispetto ai pacchetti persi occasionali.

  • Hypertext Transfer Protocol (HTTP)

    HTTP usa TCP e viene usato dai server Web. Lo schema "httpd://" indica che l'origine è scaricabile da un server Web. HTTP viene usato anche in caso di firewall, che in genere sono configurati per accettare richieste HTTP e in genere rifiutano altri protocolli di streaming.

L'applicazione può ottenere i protocolli supportati da Media Foundation usando l'interfaccia IMFNetSchemeHandlerConfig . A tale scopo, l'applicazione deve prima recuperare il numero di protocolli chiamando IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols e quindi ottenere il tipo di protocollo in base all'indice chiamando IMFNetSchemeHandlerConfig::GetSupportedProtocolType. Questo metodo restituisce uno dei valori definiti nell'enumerazione MFNETSOURCE_PROTOCOL_TYPE .

L'applicazione può anche ottenere gli schemi supportati dal resolver di origine chiamando la funzione MFGetSupportedSchemes .

Rollover del protocollo

Quando un'applicazione specifica "mms://" come schema URL, il resolver di origine esegue un'operazione di rollover del protocollo . In questo processo, il resolver di origine determina il protocollo migliore per l'origine di rete da usare per ottenere il contenuto. In genere, per il vapore multimediale, RTSP con UDP (RTSPU) è più efficiente rispetto a HTTP. Tuttavia, se il contenuto è ospitato in un server Web, HTTP è una scelta migliore.

Il rollover del protocollo può verificarsi anche quando un tentativo di usare il protocollo specificato nello schema URL ha esito negativo. Ad esempio, un protocollo può avere esito negativo quando un firewall blocca i pacchetti UDP. In questo caso, il resolver di origine passa a HTTP.

Il rollover del protocollo non si applica se lo schema URL contiene un protocollo specifico, ad esempio "rtspu://". Inoltre, il rollover non viene eseguito se l'autenticazione ha esito negativo o il server ha raggiunto un limite di connessioni client. È consigliabile che le applicazioni specifichino lo schema "mms://" e consentano al resolver di origine di selezionare il protocollo migliore per lo scenario.

La tabella seguente elenca l'ordine di rollover.

Schemi consentiti Ordine di rollover del protocollo
mms:// o rtsp:// Cache veloce abilitata:
  1. RTSP con TCP (RTSPT)
  2. RTSP con UDP (RTSPU)
  3. HTTP Streaming
  4. Download HTTP (HTTPD)
Cache veloce disabilitata:
  1. RTSPU
  2. RTSPT
  3. HTTP Streaming
  4. HTTP Download
rtspu:// RTSPU
rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

Recupero del protocollo corrente

Dopo un'operazione di rollover del protocollo, l'origine di rete potrebbe usare un protocollo diverso da quello specificato dall'applicazione nello schema URL. Il risultato del rollover del protocollo è disponibile per l'applicazione dopo che l'origine di rete stabilisce la connessione con il server multimediale.

Per ottenere il protocollo e il trasporto usati per ottenere il contenuto, l'applicazione può recuperare i valori delle proprietà per la proprietà MFNETSOURCE_PROTOCOL e la proprietà MFNETSOURCE_TRANSPORT di un oggetto IPropertyStore dall'origine di rete.

Il codice seguente illustra come ottenere questi valori.

// 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);

    }

Nel codice di esempio precedente IPropertyStore::GetValue recupera il valore MFNETSOURCE_PROTOCOL, che è un membro dell'enumerazione MFNETSOURCE_PROTOCOL_TYPE . Per MFNETSOURCE_TRANSPORT, il valore è un membro dell'enumerazione MFNETSOURCE_TRANSPORT_TYPE .

In alternativa, l'applicazione può ottenere gli stessi valori usando il servizio MFNETSOURCE_STATISTICS_SERVICE. Per usare questo servizio, l'applicazione può chiamare la funzione MFGetService per ottenere l'archivio delle proprietà dall'origine di rete. Questo archivio proprietà contiene statistiche di rete nella proprietà MFNETSOURCE_STATISTICS . I valori di protocollo e trasporto possono essere recuperati specificando MFNETSOURCE_PROTOCOL_ID e MFNETSOURCE_TRANSPORT_ID, definiti nell'enumerazione MFNETSOURCE_STATISTICS_IDS . Il codice seguente illustra come ottenere i valori di protocollo e trasporto usando il servizio 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);

    }

Abilitazione e disabilitazione dei protocolli

L'applicazione può configurare l'origine di rete in modo che determinati protocolli vengano ignorati durante il processo di rollover. A tale scopo, le proprietà dell'origine di rete vengono usate per disabilitare protocolli specifici. La tabella seguente illustra le proprietà e i protocolli che controllano.

Proprietà Descrizione
MFNETSOURCE_ENABLE_HTTP Abilita o disabilita HTTP e HTTPD.
MFNETSOURCE_ENABLE_RTSP Abilita o disabilita RTSPU e RTSPT.
MFNETSOURCE_ENABLE_TCP Abilita o disabilita RTSPT.
MFNETSOURCE_ENABLE_UDP Abilita o disabilita RTSPU.
MFNETSOURCE_ENABLE_DOWNLOAD Abilita o disabilita HTTPD.
MFNETSOURCE_ENABLE_STREAMING Abilita o disabilita RTSPU, RTSPT e HTTP.

 

Rete in Media Foundation