Condividi tramite


Codifica della velocità in bit delle variabili non vincolate

In modalità di codifica VBR (Unconstrained Variable Bit Rate), il contenuto viene codificato con la massima qualità possibile mantenendo una velocità di bit specificata.

La codifica VBR non vincolata usa due passaggi di codifica. Quando si usa la codifica VBR non vincolata, si specifica una velocità di bit per il flusso, come si farebbe con codifica della velocità in bit costante. Tuttavia, il codificatore usa questo valore solo come velocità media di bit per il flusso e codifica in modo che la qualità sia il più elevata possibile mantenendo la media. I singoli campioni prodotti dal codificatore variano in base alle dimensioni senza limiti espliciti del buffer. Tuttavia, la velocità media dei bit durante la sessione di codifica e la durata del flusso non devono essere più del valore specificato dall'utente. La velocità effettiva in bit in qualsiasi punto del flusso codificato può variare notevolmente rispetto al valore medio. Non si imposta una finestra del buffer per la codifica VBR non vincolata. Il codificatore calcola invece le dimensioni della finestra del buffer richiesta in base ai requisiti degli esempi codificati. Ciò significa che non esiste alcun limite alle dimensioni dei singoli campioni nel flusso, purché la velocità media dei bit sia minore o uguale al valore impostato.

Il vantaggio della codifica VBR non vincolata è che il flusso compresso ha la massima qualità possibile pur rimanendo all'interno di una larghezza di banda media prevedibile. Usare questa opzione quando è necessario specificare una larghezza di banda, ma le fluttuazioni intorno alla larghezza di banda specificata sono accettabili; ad esempio, solo per i file locali o il download.

Lo svantaggio di questa modalità di codifica è che il codificatore può impostare la finestra del buffer su qualsiasi valore richiesto dopo la codifica, senza alcun controllo sulle dimensioni del buffer. Nella maggior parte dei casi, se non si è interessati alle dimensioni del buffer o alla coerenza dell'utilizzo della larghezza di banda, è consigliabile usare Quality-Based codifica a velocità in bit variabile

Configurazione del codificatore per VBR non vincolato

La configurazione del codificatore viene impostata tramite i valori delle proprietà. Queste proprietà sono definite in wmcodecdsp.h. Le proprietà di configurazione devono essere impostate sul codificatore prima di negoziare il tipo di supporto di output. Per informazioni su come impostare le proprietà nel codificatore, vedere Configurazione del codificatore. In base ai valori delle proprietà specificati, è possibile enumerare i tipi di output VBR supportati e selezionarne uno nel codificatore Media Foundation Transform (MFT) in base alla velocità media dei bit.

L'elenco seguente mostra le proprietà che è necessario impostare per questo tipo di codifica:

  • Specificare la modalità di codifica VBR impostando la proprietà MFPKEY_VBRENABLED su VARIANT_TRUE.
  • Impostare il MFPKEY_PASSESUSED su 2 perché la modalità VBR non vincolata usa due passaggi di codifica.
  • Durante l'enumerazione del tipo di supporto di output, controllare l'attributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (per i flussi audio) o l'attributo MF_MT_AVG_BITRATE (per i flussi video) dei tipi di supporti di output disponibili. Scegliere un tipo di supporto di output con la velocità media dei bit più vicina alla velocità media di bit desiderata che il codificatore mantenga nel contenuto codificato. Per ulteriori informazioni sulla selezione del tipo di supporto di output, vedere Negoziazione del tipo di supporto sull'encoder.

Per ottenere il valore della finestra del buffer impostato dal codificatore, chiamare IWMCodecLeakyBucket::GetBufferSizeBits, definito in wmcodecifaces.h e wmcodecdspuuid.lib, dopo la sessione di codifica. Per aggiungere il supporto VBR non vincolato per i flussi, è necessario impostare questo valore nell'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (valori di bucket persi medi) nell'oggetto di configurazione del flusso durante la configurazione del profilo ASF.

Di seguito viene modificato il metodo SetEncodingType della classe di esempio CEncoder per configurare la modalità VBR non vincolata. Per informazioni su questa classe, vedere codice di esempio del codificatore . Per informazioni sulle macro helper usate in questo esempio, vedere Uso degli esempi di codice di Media Foundation.

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
    if (!m_pMFT)
    {
        return MF_E_NOT_INITIALIZED;
    }

    HRESULT hr = S_OK;

    IPropertyStore* pProp = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    //Query the encoder for its property store
    CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
    
    if (mode == EncodeMode_VBR_Unconstrained)
    {
        //Set the VBR property to TRUE, which indicates VBR encoding
        var.vt = VT_BOOL;
        var.boolVal = TRUE;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
        PropVariantClear(&var);

        //Set number of passes
        var.vt = VT_I4;
        var.lVal  =2;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
        PropVariantClear(&var);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

Tipi di Codifica ASF

Il Modello di Buffer Leaky Bucket

Come creare una topologia per la codifica Two-Pass Windows Media