Modello di buffer del bucket perforato (Microsoft Media Foundation)
Quando si trasmette un supporto in rete, il decodificatore riceve dati codificati a una velocità teoricamente costante (la velocità di trasmissione). Il decodificatore utilizza questi dati per produrre output decodificato. Nel caso generale, tuttavia, il decodificatore utilizza i dati a una velocità variabile, perché il codificatore può usare una frequenza di codifica variabile.
Il modello "secchio bucato" è un modo per modellare i requisiti di buffering per una riproduzione fluida. In questo modello il decodificatore gestisce un buffer. I dati codificati passano dalla rete al buffer e dal buffer al decodificatore. Se si verifica un underflow del buffer, significa che il decodificatore rimuove i dati dal buffer più velocemente rispetto alla velocità di consegna della rete. Se il buffer si riempie, significa che la rete distribuisce i dati più velocemente rispetto a quanto il decodificatore riesca a elaborare.
In questo argomento viene descritto il modello del "secchio che perde" dei buffer per la codifica e la decodifica.
- Il Secchio Trafitto
- Il secchio in uso
- Impostazione dei valori del bucket Leaky per i flussi ASF
- Valori del Leaky Bucket nel multiplexer ASF
- Aggiornamento dei Valori di Leaky Bucket nel Sink Multimediale ASF
- argomenti correlati
Il secchio perdente
Per comprendere il modello del secchio che perde, considera un secchio con un piccolo foro nella parte inferiore. Tre parametri definiscono il bucket:
- Capacità (B)
- Velocità con cui l'acqua scorre fuori dal secchio (R)
- La pienezza iniziale del secchio (F)
In questa metafora il bucket è il buffer:
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 secchio accumula acqua. Se la frequenza di input è maggiore di R per un periodo prolungato, alla fine il secchio trabocca. Tuttavia, la frequenza di input può variare intorno R senza sovraccaricare il 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 secchio traboccante è definito da tre parametri:
- Velocità media in bit, in byte al secondo, che corrisponde alla velocità di output (R)
- Finestra del buffer, misurata in millisecondi, che corrisponde alla capacità del bucket (B).
- La pienezza iniziale del buffer, che in genere è impostata 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 quel tasso di bit che possono essere contenuti nel buffer. Le dimensioni del buffer in bit sono uguali a R * (B / 1000).
I dati del payload ASF possono entrare nel secchio con perdite in momenti e quantità irregolari, ma devono lasciare il secchio a una frequenza di bit positiva e costante. A causa della finestra del buffer, si verifica un possibile ritardo tra il tempo in cui il payload entra nel bucket e quando esce. Il ritardo massimo che può verificarsi è B/R. I dati del payload che affluiscono nel bucket sono in base al momento della presentazione e non devono mai superare la capacità del bucket. Oltre all'ora di presentazione, ogni payload ha anche un tempo di invio, ovvero il tempo 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 a perdita si avvicina a essere pieno, ogni payload lasci 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 (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 è entrato troppo tardi nel bucket e non può essere incluso nell'oggetto dati. Il valore del preroll è incluso nell'ASF Header Object .
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 di secchio traforato ASF garantisce che i dati multimediali vengano inviati attraverso la rete a una velocità di bit costante. I parametri del leaky bucket vengono specificati nell'oggetto Proprietà flusso estese dell'intestazione ASF . In Microsoft Media Foundation vengono impostati come attributi nel tipo multimediale che rappresenta il flusso.
I valori di Leaky Bucket vengono 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 secchio di fuga 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_RMAXe MFPKEY_BMAX. Per informazioni sull'impostazione delle proprietà nel codificatore, vedere proprietà di codifica .
Secchio in uso
L'obiettivo di un codificatore è garantire che il contenuto non esonda 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 bucket di 3 galloni con un foro in esso attraverso il quale 1 gallone può fluire al minuto. Metti il secchio sotto un spigot e apri la valvola per lasciare acqua a una velocità di 1 gallone al minuto. L'acqua scorre fuori dal secchio appena entra, lasciando nessun elemento aggiuntivo nel secchio. Quindi si aumenta il flusso dal spigot a 2 galloni al minuto. Ogni minuto in cui l'acqua scorre a questa velocità, 2 galloni vanno nel secchio e 1 gallone esce fuori, lasciando 1 gallone nel secchio. Alla fine di 3 minuti, 6 galloni di acqua sono stati versati nel secchio, 3 galloni sono fuoriusciti, e il secchio è pieno.
In pratica, la velocità massima teorica dei dati su un intervallo uguale alla finestra del buffer non viene mai ottenuta. Nell'esempio precedente si presuppone una frequenza dati costante. Dato lo stesso bucket da 3 galloni, è possibile aumentare la velocità 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 è entro il massimo teorico per la finestra buffer, la concentrazione di tale quantità in una parte della finestra fa sì che il secchio si sovraffonda. A una velocità di 6 galloni al minuto, il secchio da 3 galloni trabocca poco dopo 30 secondi. Di conseguenza, 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 anche un buffer a secchio con perdita è utilizzato dal codificatore che crea il contenuto compresso. Il codificatore apporta le modifiche necessarie agli algoritmi di compressione per mantenere la velocità di bit dei campioni compressi entro i limiti descritti dalla frequenza 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 uno specchio del bucket del decodificatore. Il bucket del codificatore viene riempito a una velocità variabile determinata dalle dimensioni dei singoli campioni e fuoriesce a una velocità costante uguale al bit rate medio.
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 occupa 7.000 bit. Il buffer del codificatore contiene ora 7.000 bit. I 29 fotogrammi successivi sono tutti fotogrammi differenziali che hanno un totale di 3.000 bit. Quindi il primo secondo di contenuto (30 fotogrammi) metterebbe l'interezza del buffer a 10.000 bit se nulla perdesse. 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 campioni.
Impostazione dei valori del Leaky Bucket per i flussi ASF
In uno scenario di codifica dei file, un'applicazione può impostare i valori del secchio traforato 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:
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (valori medi di leaky bucket)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (valori massimi di leaky bucket)
Per informazioni sull'aggiunta di flussi e sul recupero del puntatore IMFASFStreamConfig, vedere Aggiunta di informazioni di flusso al sink di file ASF.
Questi valori contengono il set di informazioni seguente:
- Velocità media dei bit: Ottieni la velocità media dei bit dal tipo di media di output selezionato durante la negoziazione del tipo di media. 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 del buffer: se si dispone di un'istanza del codificatore e si sono negoziati i tipi di supporto di output, è possibile aggiornare questo valore successivamente interrogando il codificatore per l'interfaccia IWMCodecLeakyBucket e quindi chiamando IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). In caso contrario, usare il valore predefinito di 3000 millisecondi.
- Dimensioni iniziali del buffer: impostata su 0.
I valori forniti dall'applicazione dipendono dal tipo di codifica e dal tipo di supporto del flusso. Ad esempio, Codifica a bitrate costante richiede un bitrate fisso predeterminato e una finestra di buffer. L'applicazione può specificare questi valori leaky bucket impostando la proprietà di codifica MFPKEY_VIDEOWINDOW e l'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 sul flusso. I valori della finestra del buffer specificati vengono usati per garantire che il file codificato abbia i tempi di invio corretti contrassegnati sui pacchetti di dati e che il valore di preroll venga visualizzato nell'oggetto Header ASF. È sufficiente impostare MF_ASFSTREAMCONFIG_LEAKYBUCKET1 perché questi valori specificati vengono copiati nell'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET2.
Per le modalità di codifica a 2 passaggi è necessario impostare entrambi questi attributi per specificare i valori medi e massimi.
Per la codifica VBR, l'applicazione può eseguire query sui valori di bucket persi 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 leaky buckets. Dopo la codifica, l'applicazione deve eseguire una query sul codificatore per le proprietà MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAXe MFPKEY_BMAX e impostarle nel sink multimediale in modo che i valori accurati vengano riflessi nell'oggetto Header. Per un esempio di codice su come aggiornare i valori per la codifica VBR, vedere "Aggiornare le proprietà di codifica nella destinazione del file" in Tutorial: 1-Pass Windows Media Encoding.
Se si copia contenuto di Windows Media dall'origine al sink multimediale senza ricodifica, i valori del leaky bucket devono essere impostati nel sink multimediale.
Valori del Leaky Bucket nel multiplexer ASF
In Media Foundation, i valori di bucket persi vengono usati dal ASF Multiplexer per configurare i valori di bucket persi interni usati per generare pacchetti di dati. Il payload è contenuto all'interno di un esempio multimediale e una serie di esempi multimediali costituisce un pacchetto di dati ASF. In base ai valori di bucket persi e all'ora di presentazione, il multiplexer assegna un tempo di invio per ogni campione multimediale in modo che la frequenza di bit dei pacchetti inviati in rete sia a una velocità in bit costante (R).
Un'applicazione non può impostare direttamente i valori del "leaky bucket" nel multiplexer. I valori devono essere specificati nell'ASF media sink, che imposta i valori appropriati sul multiplexer. I valori impostati in MF_ASFSTREAMCONFIG_LEAKYBUCKET1 e MF_ASFSTREAMCONFIG_LEAKYBUCKET2 vengono utilizzati dal multiplexer per convalidare che i campioni di dati inviati al sink multimediale ASF siano generati utilizzando i valori specificati.
Aggiornamento dei valori del secchio che perde nel sink multimediale ASF
Un'applicazione può sovrascrivere i valori di bucket persi 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à, utilizzare l'oggetto ContentInfo implementato dal sink multimediale. Per ulteriori informazioni, vedere Impostazione delle proprietà nel File Sink.
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 velocità di bit impostata nel tipo di supporto, il codificatore calcola le dimensioni del buffer per garantire che i campioni di supporti generati non esondano mai il buffer. Il codificatore apporta le modifiche necessarie durante la compressione per mantenere la velocità di bit dei campioni compressi entro i limiti descritti dalla frequenza di bit e dalla finestra del buffer.
Analogamente agli attributi di configurazione del flusso per i bucket a perdita, impostare la velocità media dei bit, le dimensioni del buffer e la pienezza iniziale del buffer in una matrice di DWORD. Per ulteriori informazioni, consultare la sezione "Impostazione dei valori del bucket Leaky per i flussi ASF" in questo argomento.
Argomenti correlati