Creazione dell'oggetto Multiplexer

Il multiplexer ASF è un oggetto livello WMContainer che funziona con l'oggetto dati ASF e offre a un'applicazione la possibilità di generare pacchetti di dati ASF per flussi multimediali.

L'oggetto multiplexer espone l'interfaccia IMFASFMultiplexer . Per creare il multiplexer, chiamare MFCreateASFMultiplexer. Questa funzione restituisce un puntatore a un oggetto vuoto. Se l'applicazione sta scrivendo un nuovo file ASF, l'applicazione deve inizializzare il multiplexer con un oggetto ContentInfo. A tale scopo, chiamare IMFASFMultiplexer::Initialize. L'oggetto ContentInfo specificato rappresenta l'oggetto intestazione ASF del nuovo file. Per informazioni sulla creazione e l'inizializzazione dell'oggetto ContentInfo per un nuovo file, vedere Inizializzazione dell'oggetto ContentInfo di un nuovo file ASF.

Il metodo Initialize analizza l'oggetto ContentInfo per raccogliere informazioni di configurazione del flusso, ad esempio il numero di flussi, le dimensioni dei pacchetti e la preroll. Facoltativamente, il multiplexer potrebbe anche richiedere parametri bucket persi e le unità di estensione del payload. Queste informazioni sono necessarie per generare pacchetti di dati che soddisfano i requisiti definiti nell'oggetto intestazione ASF. Il metodo Initialize configura il multiplexer in base al tipo di supporto e alle impostazioni di configurazione dei flussi. Ad esempio, se un flusso è configurato per avere estensioni di payload (vedere Creazione e configurazione di flussi ASF) e quindi il multiplexer è configurato per aggiungere tali valori ai pacchetti di dati generati.

Il metodo Initialize ottiene anche un handle per l'oggetto dati iniziale creato durante la creazione dell'oggetto ContentInfo per la scrittura. Durante la generazione di pacchetti di dati, il multiplexer aggiunge pacchetti all'oggetto dati e li aggiorna in modo appropriato. Dopo che il multiplexer genera tutti i pacchetti di dati, aggiorna l'oggetto ContentInfo fornito in modo che determinati valori, ad esempio il numero di pacchetti di dati, vengano aggiornati.

Nell'esempio di codice seguente viene illustrato come creare un multiplexer e inizializzarlo con un oggetto ContentInfo.

//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the 
// output file.
//-------------------------------------------------------------------

HRESULT CreateOutputGenerators(
    IMFASFProfile *pProfile, 
    IMFASFContentInfo **ppContentInfo, 
    IMFASFMultiplexer **ppMux
    )
{
    IMFASFContentInfo *pContentInfo = NULL;
    IMFASFMultiplexer *pMux = NULL;

    // Use the ASF profile to create the ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);

    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->SetProfile(pProfile);
    }

    // Create the ASF Multiplexer object.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFMultiplexer(&pMux);
    }
    
    // Initialize it using the new ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pMux->Initialize(pContentInfo);
    }

    // Return the pointers to the caller.
    if (SUCCEEDED(hr))
    {
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();

        *ppMux = pMux;
        (*ppMux)->AddRef();
    }

    SafeRelease(&pContentInfo);
    SafeRelease(&pMux);

    return hr;
}

Per visualizzare questa funzione usata in un'applicazione completa, vedere Esercitazione: Copia di flussi ASF da un file a un altro.

Inizializzazione multiplexer e impostazioni bucket persi

Il metodo IMFASFMultiplexer::Initialize configura il multiplexer per determinare il flusso di dati del bucket di perdita. Per configurare questi parametri, assicurarsi che i valori delle proprietà seguenti siano impostati nell'oggetto ContentInfo specificato. Per informazioni sull'impostazione di queste proprietà, vedere Impostazione delle proprietà nell'oggetto ContentInfo.

  • MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE proprietà: indica se il multiplexer deve regolare automaticamente la velocità di bit per mantenere il flusso di dati nel bucket di perdita. Questa impostazione può essere modificata dall'applicazione chiamando IMFASFMultiplexer::SetFlags e passando il flag MFASF_MULTIPLEXER_AUTOADJUST_BITRATE .

  • MFPKEY_ASFMEDIASINK_BASE_SENDTIME proprietà: il tempo di invio indica quando verrà rilasciato il payload all'interno del bucket persa. I tempi di invio devono essere uguali o precedenti all'ora di presentazione perché il payload deve avere tempo per arrivare alla destinazione prima dell'ora della presentazione.

    Questo valore della proprietà è la prima volta di invio. Il multiplexer usa questo valore per calcolare i tempi di invio successivi per garantire che i dati vengano trasmessi costantemente attraverso il bucket. Se il flag MFASF_MULTIPLEXER_AUTOADJUST_BITRATE è stato impostato sul multiplexer, il multiplexer regola la velocità di bit in modo che il payload venga inviato quando la finestra del buffer è vicina a essere piena. Se il flag non è impostato, il multiplexer non riesce a generare pacchetti di dati a causa del sovraccarico della larghezza di banda.

Il multiplexer ottiene le informazioni di configurazione del flusso dal profilo ASF associato all'oggetto ContentInfo specificato nel metodo Initialize . Le informazioni di configurazione del flusso includono parametri bucket persi. Questo valore è richiesto dal multiplexer per generare pacchetti di dati.

Per specificare i parametri bucket persi, impostare i valori nell'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 nell'oggetto di configurazione del flusso che rappresenta il flusso nel profilo. Per usare il valore della finestra del buffer, usato dal codificatore, chiamare IWMCodecLeakyBucket::GetBufferSizeBits. Il valore effettivo della finestra del buffer è noto solo dopo l'impostazione del tipo di supporto di output del codificatore. Per informazioni sull'impostazione del tipo di supporto di output, vedere Negoziazione del tipo di supporto nel codificatore.

Nota

I valori bucket persi usati dal codificatore potrebbero essere diversi nell'oggetto ContentInfo fornito dal profilo ASF usato per creare il multiplexer.

 

Il metodo Initialize aggiorna l'oggetto ContentInfo in modo che i valori corretti vengano riflessi nell'oggetto intestazione ASF finale.

ASF Multiplexer

Generazione di nuovi pacchetti di dati ASF