Share via


Modello di buffer bucket persi (Microsoft Media Foundation)

Quando si trasmette un supporto in rete, il decodificatore riceve dati codificati a una velocità teoricamente costante (velocità di trasmissione). Il decodificatore utilizza questi dati per produrre output decodificato. Nel caso generale, tuttavia, il decodificatore utilizza i dati a una frequenza variabile , perché il codificatore può usare una frequenza di codifica variabile.

Il modello "bucket perdente" è un modo per modellare i requisiti di buffering per la riproduzione senza problemi. In questo modello il decodificatore mantiene un buffer. I dati codificati passano dalla rete al buffer e dal buffer al decodificatore. Se il buffer viene sottoposto a underflow, significa che il decodificatore sta rimuovendo i dati dal buffer più velocemente rispetto al recapito della rete. Se l'overflow del buffer viene superato, significa che la rete distribuisce i dati più velocemente rispetto al decodificatore lo utilizza.

In questo argomento viene descritto il modello "bucket di perdita" dei buffer per la codifica e la decodifica.

Il bucket traspelato

Per comprendere il modello di bucket persa, prendere in considerazione un bucket con un piccolo foro nella parte inferiore. Tre parametri definiscono il bucket:

  • Capacità (B)
  • Velocità con cui l'acqua scorre fuori dal secchio (R)
  • Completezza iniziale del bucket (F)

In questa metafora, il bucket è il buffer:

illustrazione che mostra un buffer come bucket, la frequenza di input come acqua che entra nel bucket e la velocità di output come acqua lasciando attraverso un foro nel bucket

Se l'acqua viene versata nel bucket a velocità esatta R, il bucket rimarrà a F, perché la velocità di input è uguale alla velocità di output. Se la velocità di input aumenta mentre R rimane costante, il bucket accumula acqua. Se la velocità di input è maggiore di R per un periodo prolungato, alla fine il bucket supera i flussi. Tuttavia, la velocità di input può variare intorno a R senza sovraflow del bucket, purché la velocità di input media non superi la capacità del bucket. Maggiore è la capacità, più la velocità di input può variare entro un determinato intervallo di tempo.

In ASF il bucket persa è definito da tre parametri:

  • Velocità media dei bit, in byte al secondo, che corrisponde alla frequenza di output (R)
  • Finestra del buffer, misurata in millisecondi, che corrisponde alla capacità del bucket (B).
  • Fullness del buffer iniziale, in genere impostato su zero.

La velocità in bit misura il numero medio di bit al secondo nel flusso codificato. La finestra del buffer misura il numero di millisecondi di dati a tale velocità di bit che può rientrare nel buffer. Le dimensioni del buffer in bit sono uguali a R * (B / 1000).

I dati del payload ASF possono entrare nel bucket persa in momenti irregolari e in quantità irregolari, ma devono lasciare il bucket a una velocità di bit positiva costante. A causa della finestra del buffer, si verifica un possibile ritardo tra il tempo in cui il payload entra nel bucket e quando viene lasciato. Il ritardo massimo che può verificarsi è B/R. I dati del payload che entra nel bucket sono in base all'ora di presentazione e non devono mai sovraflowre il bucket. Oltre all'ora di presentazione, ogni payload ha anche un tempo di invio, ovvero l'ora in cui i dati del payload lasciano il bucket in base alla velocità di bit. L'ora di invio deve essere precedente all'ora di presentazione per assicurarsi che, quando il bucket persa si avvicina a essere pieno, ogni payload lascia il bucket prima o al momento della presentazione. A tale scopo, i tempi di presentazione vengono spostati in avanti in base al valore B/R (il preroll) e i tempi di invio iniziano a partire da zero. L'ora di invio non deve essere successiva all'ora di presentazione perché indica che il payload ha immesso il bucket troppo tardi e non può essere incluso nell'oggetto dati. Il valore della preroll è incluso nell'oggetto intestazione ASF .

Per lo streaming senza problemi in rete, i flussi compressi all'interno del contenuto multimediale devono mantenere una frequenza di bit costante per tutta la durata della riproduzione. Il modello bucket di perdita asf garantisce che i dati multimediali vengano inviati attraverso la rete a una velocità di bit costante. I parametri del bucket di perdita vengono specificati nell'oggetto Proprietà flusso esteso dell'oggetto intestazione ASF. In Microsoft Media Foundation vengono impostati come attributi sul tipo di supporto che rappresenta il flusso.

I valori bucket persi sono definiti sia nel sink del file ASF che nell'oggetto multiplexer ASF sottostante e nel codificatore Windows Media. Questi valori possono essere uguali o diversi. Si consideri ad esempio uno scenario di streaming, che richiede che gli esempi audio vengano recapitati in un secondo momento rispetto agli esempi video in modo che il file possa essere trasmesso senza latenza. A tale scopo, il bucket di perdita del flusso audio nel sink multimediale può essere impostato su un valore superiore al valore impostato nel codificatore audio di Windows Media.

Per impostare i valori B/R nel codificatore, l'applicazione deve impostare le proprietà MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX e MFPKEY_BMAX . Per informazioni sull'impostazione delle proprietà nel codificatore, vedere Proprietà di codifica.

Bucket in uso

L'obiettivo di un codificatore è garantire che il contenuto non esevolva mai il buffer. Il codificatore usa i valori della frequenza di bit e della finestra del buffer come guide. Il numero effettivo di bit passati in qualsiasi periodo di tempo uguale alla finestra del buffer non può mai essere maggiore del doppio delle dimensioni del buffer.

Si consideri l'esempio seguente: si dispone di un secchio da 3 galloni con un foro in esso attraverso il quale 1 gallone può fluire al minuto. Si mette il secchio sotto una spigot e si apre la valvola per lasciare l'acqua a una velocità di 1 gallone al minuto. L'acqua scorre fuori dal secchio appena entra, lasciando senza più nel secchio. Si aumenta quindi il flusso dallo spigot a 2 galloni al minuto. Ogni minuto che l'acqua scorre a questa velocità, 2 galloni vanno nel secchio e 1 gallone perdite, lasciando 1 gallone nel secchio. Alla fine di 3 minuti, 6 galloni di acqua sono andati nel secchio, 3 galloni hanno perso, e il secchio è pieno.

In pratica, la velocità massima teorica dei dati su un intervallo uguale alla finestra del buffer non viene mai raggiunta. Nell'esempio precedente si presuppone una frequenza dati costante. Dato lo stesso bucket da 3 galloni, è possibile aumentare la frequenza di flusso dal spigot a 6 galloni al minuto per un minuto e quindi disattivare lo spigot per due minuti. Anche se la quantità totale di acqua inserita nel secchio rientra nel valore massimo teorico per la finestra buffer, la concentrazione di tale quantità in una parte della finestra fa sì che il secchio si sovraffonda. A 6 galloni al minuto, il bucket di 3 galloni supera poco dopo 30 secondi. Pertanto, la quantità massima effettiva di dati che possono essere recapitati al buffer per tutta la durata di qualsiasi intervallo uguale all'impostazione della finestra del buffer dipende dalle dimensioni dei singoli campioni e dal momento in cui vengono recapitati.

Finora gli esempi hanno discusso solo il buffer usato dal decodificatore, ma un buffer bucket persa viene usato anche dal codificatore che crea il contenuto compresso. Il codificatore apporta le modifiche necessarie agli algoritmi di compressione per mantenere la velocità in bit dei campioni compressi all'interno dei limiti descritti dalla velocità di bit e dalla finestra del buffer, presupponendo che i campioni vengano recapitati al decodificatore a una velocità costante. È possibile considerare il bucket del codificatore come il mirroring del bucket del decodificatore. Il bucket del codificatore viene riempito a una velocità variabile determinata dalle dimensioni dei singoli campioni e perdite a una velocità costante uguale alla velocità media dei bit.

Si consideri l'esempio seguente di un codificatore e di un decodificatore connessi insieme tramite una rete. Si codifica un file video a 30 fotogrammi al secondo con una velocità di bit di 6.000 bit al secondo e una finestra del buffer di 3 secondi (una dimensione totale del buffer di 18.000 bit). Il primo esempio viene codificato come fotogramma chiave e richiede fino a 7.000 bit. Il buffer del codificatore contiene ora 7.000 bit. I 29 fotogrammi successivi sono tutti fotogrammi differenziali che totali 3.000 bit. Quindi il primo secondo di contenuto (30 frame) metterebbe la fullness del buffer a 10.000 bit se non si perde nulla. Sappiamo che la velocità in bit del flusso è di 6.000 bit al secondo, quindi dopo il primo secondo di contenuto codificato viene inserita nel buffer del codificatore, la completezza scende a 4.000 bit. Nell'applicazione di decodifica, questo flusso viene recapitato al buffer del decodificatore a 6.000 bit al secondo. Dopo un secondo, il buffer contiene 6.000 bit. Il primo esempio contiene 7.000 bit, quindi il buffer del decodificatore deve essere riempito di più prima che il decodificatore inizi a rimuovere i campioni.

Impostazione dei valori bucket per perdita di dati per i flussi ASF

In uno scenario di codifica file, un'applicazione può impostare i valori del bucket persi durante la configurazione dei flussi nel profilo ASF.

Dopo aver creato il flusso e avere un riferimento all'interfaccia IMFASFStreamConfig del flusso, è possibile impostare i valori usando gli attributi seguenti:

Per informazioni sull'aggiunta di flussi e sul recupero del puntatore IMFASFStreamConfig , vedere Aggiunta di informazioni di flusso al sink del file ASF.

Questi valori contengono il set di informazioni seguente:

  • Velocità media bit: ottiene la velocità media dei bit dal tipo di supporto di output selezionato durante la negoziazione del tipo di supporto. Usare l'attributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (per i flussi audio) o l'attributo MF_MT_AVG_BITRATE (per i flussi video).
  • Finestra buffer: se si dispone di un'istanza del codificatore e si hanno tipi di supporti di output negoziati, è possibile aggiornare questo valore in un secondo momento eseguendo una query sul codificatore per l'interfaccia IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). In caso contrario, usare il valore predefinito di 3000 millisecondi.
  • Dimensioni iniziali del buffer: impostare su 0.

I valori forniti dall'applicazione dipendono dal tipo di codifica e dal tipo di supporto del flusso. Ad esempio, la codifica a velocità in bit costante richiede una frequenza di bit fissa predeterminata e una finestra del buffer. L'applicazione può specificare questi valori bucket di perdita impostando la proprietà di codifica MFPKEY_VIDEOWINDOW e l'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 nel flusso. I valori della finestra del buffer specificati vengono usati per assicurarsi che il file codificato abbia i tempi di invio corretti contrassegnati sui pacchetti di dati e il valore di preroll venga visualizzato nell'oggetto intestazione ASF. È sufficiente impostare MF_ASFSTREAMCONFIG_LEAKYBUCKET1 perché questi valori specificati vengono copiati nell'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .

Per le modalità di codifica a 2 pass è necessario impostare entrambi questi attributi per specificare i valori medi e massimi.

Per la codifica VBR, l'applicazione può eseguire una query sui valori del bucket di perdita usati dal codificatore solo dopo il completamento del passaggio di codifica. Pertanto, durante la configurazione del sink multimediale, l'applicazione può scegliere di non impostare gli attributi o le proprietà correlate ai bucket in perdita. Dopo la codifica, l'applicazione deve eseguire query sul codificatore per il MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX e MFPKEY_BMAX proprietà e impostarle nel sink multimediale in modo che i valori accurati vengano riflessi nell'oggetto Intestazione. Per esempio di codice su come aggiornare i valori per la codifica VBR, vedere "Aggiornare le proprietà di codifica nel sink file" in Esercitazione: Codifica di Windows Media 1 pass.

Se si copia il contenuto di Windows Media dall'origine al sink multimediale senza codifica, i valori del bucket di perdita devono essere impostati nel sink multimediale.

Valori di bucket in perdita nel multiplexer ASF

In Media Foundation i valori del bucket di perdita vengono usati dal multiplexer ASF per configurare i valori del bucket di perdita interna usati per generare pacchetti di dati. Il payload è contenuto all'interno di un esempio multimediale e una serie di campioni multimediali costituisce un pacchetto di dati ASF. In base ai valori del bucket in perdita e all'ora di presentazione, il multiplexer assegna un tempo di invio per ogni esempio multimediale in modo che le velocità di bit dei pacchetti inviati in rete siano a una frequenza di bit costante (R).

Un'applicazione non può impostare i valori del bucket in perdita direttamente nel multiplexer. I valori devono essere forniti nel sink multimediale ASF, che imposta i valori appropriati sul multiplexer. I valori impostati in MF_ASFSTREAMCONFIG_LEAKYBUCKET1 e MF_ASFSTREAMCONFIG_LEAKYBUCKET2 vengono usati dal multiplexer per convalidare gli esempi inviati al sink multimediale ASF tramite i valori specificati.

Aggiornamento dei valori del bucket di perdita nel sink multimediale ASF

Un'applicazione può sovrascrivere i valori del bucket a livello di flusso (impostati nel profilo ASF durante la creazione del flusso) impostando la proprietà MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET nell'archivio delle proprietà del sink multimediale. Per ottenere un riferimento all'archivio delle proprietà, usare l'oggetto ContentInfo implementato dal sink multimediale. Per altre informazioni, vedere Impostazione delle proprietà nel sink file.

Nota Questa operazione è consentita solo per i flussi audio.

Questa proprietà deve essere impostata dopo aver impostato il tipo di output nel codificatore. In base alla frequenza di bit impostata nel tipo di supporto, il codificatore calcola le dimensioni del buffer per garantire che gli esempi di supporti generati non sovraflowno mai il buffer. Il codificatore apporta modifiche necessarie durante la compressione per mantenere la frequenza di bit degli esempi compressi entro i limiti descritti dalla frequenza di bit e dalla finestra del buffer.

Analogamente agli attributi di configurazione del flusso per i bucket in perdita, impostare la frequenza media di bit e le dimensioni del buffer e la piena del buffer iniziale in una matrice di DWORD. Per altre informazioni, vedere la sezione "Impostazione dei valori dei bucket di perdita per i flussi ASF" in questo argomento.

Supporto asF in Media Foundation

Codec Windows Media