O modelo de buffer de bucket vazado (Microsoft Media Foundation)

Quando você transmite mídia por uma rede, o decodificador recebe dados codificados a uma taxa teoricamente constante (a taxa de transmissão). O decodificador consome esses dados para produzir saída decodificada. No caso geral, no entanto, o decodificador consome os dados a uma taxa variável , pois o codificador pode usar uma taxa de codificação variável.

O modelo de "bucket com vazamento" é uma maneira de modelar os requisitos de buffer para reprodução suave. Nesse modelo, o decodificador mantém um buffer. Os dados codificados vão da rede para o buffer e do buffer para o decodificador. Se o buffer estiver subfluxo, isso significa que o decodificador está removendo dados do buffer mais rapidamente do que a rede está fornecendo. Se o buffer estourar, isso significa que a rede está fornecendo dados mais rapidamente do que o decodificador os consome.

Este tópico descreve o modelo de "bucket com vazamento" de buffers para codificação e decodificação.

O bucket com vazamento

Para entender o modelo de bucket vazado, considere um bucket com um pequeno orifício na parte inferior. Três parâmetros definem o bucket:

  • A capacidade (B)
  • A taxa na qual a água flui para fora do balde (R)
  • A plenitude inicial do bucket (F)

Nesta metáfora, o bucket é o buffer:

ilustração mostrando um buffer como um bucket, taxa de entrada como água entrando no bucket e taxa de saída como água saindo por um buraco no bucket

Se a água for despejada no bucket com a taxa exata R, o bucket permanecerá em F, pois a taxa de entrada é igual à taxa de saída. Se a taxa de entrada aumentar enquanto R permanecer constante, o bucket acumulará água. Se a taxa de entrada for maior que R por um período sustentado, eventualmente o bucket estourará. No entanto, a taxa de entrada pode variar em torno de R sem estourar o bucket, desde que a taxa de entrada média não exceda a capacidade do bucket. Quanto maior a capacidade, mais a taxa de entrada pode variar dentro de uma determinada janela de tempo.

No ASF, o bucket com vazamento é definido por três parâmetros:

  • A taxa média de bits, em bytes por segundo, que corresponde à taxa de saída (R)
  • A janela do buffer, medida em milissegundos, que corresponde à capacidade do bucket (B).
  • A integridade inicial do buffer, que geralmente é definida como zero.

A taxa de bits mede o número médio de bits por segundo no fluxo codificado. A janela de buffer mede o número de milissegundos de dados a essa taxa de bits que podem caber no buffer. O tamanho do buffer em bits é igual a R * (B/1000).

Os dados de conteúdo ASF podem entrar no bucket com vazamento em horários irregulares e em quantidades irregulares, mas devem deixar o bucket a uma taxa de bits positiva constante. Devido à janela do buffer, há um possível atraso entre o tempo em que o conteúdo entra no bucket e quando ele sai. O atraso máximo que pode ocorrer é B/R. Os dados de conteúdo que entram no bucket são de acordo com o tempo de apresentação e nunca devem estourar o bucket. Além do tempo de apresentação, cada conteúdo também tem um tempo de envio — o momento em que os dados de conteúdo saem do bucket de acordo com a taxa de bits. O tempo de envio deve ser anterior ao horário da apresentação para garantir que, quando o bucket vazado estiver próximo de estar cheio, cada carga sairá do bucket antes ou no momento da apresentação. Para fazer isso, os tempos de apresentação são deslocados para frente pelo valor do B/R (o pré-registro) e os tempos de envio têm uma vantagem inicial começando em zero. O tempo de envio não deve ser posterior ao horário da apresentação, pois isso indica que o conteúdo entrou no bucket tarde demais e não pode ser incluído no objeto de dados. O valor de pré-registro está incluído no objeto de cabeçalho ASF .

Para streaming sem falhas na rede, os fluxos compactados dentro do conteúdo de mídia devem manter uma taxa de bits constante durante toda a duração da reprodução. O modelo de bucket com vazamento do ASF garante que os dados de mídia sejam enviados pela rede a uma taxa de bits constante. Os parâmetros do bucket com vazamento são especificados no Objeto de Propriedades de Fluxo Estendido do Objeto de Cabeçalho ASF. No Microsoft Media Foundation, eles são definidos como atributos no tipo de mídia que representa o fluxo.

Os valores de bucket com vazamento são definidos no coletor de arquivos ASF e no objeto multiplexador ASF subjacente e no codificador do Windows Media. Esses valores podem ser iguais ou diferentes. Por exemplo, considere um cenário de streaming, que exige que os exemplos de áudio sejam entregues posteriormente aos exemplos de vídeo para que o arquivo possa ser transmitido sem latência. Para fazer isso, o bucket vazado do fluxo de áudio no coletor de mídia pode ser definido como um valor maior do que o valor definido no codificador de áudio do Windows Media.

Para definir valores B/R no codificador, o aplicativo deve definir as propriedades MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX e MFPKEY_BMAX . Para obter informações sobre como definir propriedades no codificador, consulte Encoding Properties.

O bucket em uso

O objetivo de um codificador é garantir que o conteúdo nunca estoura o buffer. O codificador usa a taxa de bits e os valores da janela de buffer como guias. O número real de bits passados em qualquer período de tempo igual à janela de buffer nunca pode ser maior que o dobro do tamanho do buffer.

Considere o seguinte exemplo: você tem um bucket de 3 galões com um buraco no qual 1 galão pode fluir por minuto. Você coloca o balde sob uma espiga e abre a válvula para soltar água a uma taxa de 1 galão por minuto. A água flui para fora do balde tão rapidamente quanto entra, não deixando nenhum extra no balde. Então você aumenta o fluxo do spigot para 2 galões por minuto. A cada minuto que a água flui a esse ritmo, 2 galões vão para o balde e 1 galão vaza, deixando 1 galão no balde. No final de 3 minutos, 6 galões de água entraram no balde, 3 galões vazaram, e o balde está cheio.

Na prática, a taxa de dados máxima teórica em um intervalo igual à janela do buffer nunca é obtida. O exemplo anterior assumiu uma taxa de dados constante. Dado o mesmo balde de 3 galões, você pode aumentar a taxa de fluxo do spigot para 6 galões por minuto por um minuto e, em seguida, desligar o spigot por dois minutos. Embora a quantidade total de água colocada no balde esteja dentro do máximo teórico para a janela do buffer, a concentração dessa quantidade em uma parte da janela faz com que o balde transborde. A 6 galões por minuto, o balde de 3 galões estoura pouco depois de 30 segundos. Portanto, a quantidade máxima real de dados que podem ser entregues ao buffer durante qualquer intervalo igual à configuração da janela de buffer depende do tamanho das amostras individuais e quando elas são entregues.

Até agora, os exemplos discutiram apenas o buffer usado pelo decodificador, mas um buffer de bucket com vazamento também é usado pelo codificador que cria o conteúdo compactado. O codificador faz todos os ajustes necessários aos algoritmos de compactação para manter a taxa de bits das amostras compactadas dentro dos limites descritos pela taxa de bits e pela janela de buffer, supondo que os exemplos serão entregues ao decodificador a uma taxa constante. Você pode pensar no bucket do codificador como espelhamento do bucket do decodificador. O bucket do codificador é preenchido a uma taxa variável determinada pelo tamanho das amostras individuais e vazamentos a uma taxa constante igual à taxa média de bits.

Considere o exemplo a seguir de um codificador e decodificador conectados em uma rede. Você codifica um arquivo de vídeo a 30 quadros por segundo com uma taxa de bits de 6.000 bits por segundo e uma janela de buffer de 3 segundos (um tamanho total de buffer de 18.000 bits). O primeiro exemplo é codificado como um quadro-chave e ocupa 7.000 bits. O buffer do codificador agora contém 7.000 bits. Os próximos 29 quadros são todos quadros delta que totalizam 3.000 bits. Portanto, o primeiro segundo do conteúdo (30 quadros) colocaria a plenitude do buffer em 10.000 bits se nada estivesse vazando. Sabemos que a taxa de bits do fluxo é de 6.000 bits por segundo, portanto, depois que o primeiro segundo do conteúdo codificado é colocado no buffer do codificador, a plenitude cai para 4.000 bits. No aplicativo de decodificação, esse fluxo é entregue ao buffer do decodificador a 6.000 bits por segundo. Após um segundo, o buffer contém 6.000 bits. O primeiro exemplo contém 7.000 bits, portanto, o buffer de decodificador deve ser preenchido mais antes que o decodificador comece a remover amostras.

Definindo valores de bucket com vazamento para fluxos ASF

Em um cenário de codificação de arquivo, um aplicativo pode definir os valores de bucket com vazamento ao configurar os fluxos no Perfil do ASF.

Depois de criar o fluxo e ter uma referência à interface IMFASFStreamConfig do fluxo, você pode definir os valores usando os seguintes atributos:

Para obter informações sobre como adicionar fluxos e obter o ponteiro IMFASFStreamConfig , consulte Adicionando informações de fluxo ao coletor de arquivos ASF.

Esses valores contêm o seguinte conjunto de informações:

  • Taxa média de bits: obtenha a taxa média de bits do tipo de mídia de saída selecionado durante a negociação de tipo de mídia. Use o atributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (para fluxos de áudio) ou o atributo MF_MT_AVG_BITRATE (para fluxos de vídeo).
  • Janela de buffer: se você tiver uma instância do codificador e tiver negociado tipos de mídia de saída, poderá atualizar esse valor mais tarde consultando o codificador para a interface IWMCodecLeakyBucket e chamando IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). Caso contrário, use o valor padrão de 3000 milissegundos.
  • Tamanho inicial do buffer: definido como 0.

Os valores fornecidos pelo aplicativo dependem do tipo de codificação e do tipo de mídia do fluxo. Por exemplo, a Codificação de Taxa de Bits Constante requer uma taxa de bits fixa predeterminada e uma janela de buffer. O aplicativo pode especificar esses valores de bucket com vazamento definindo a propriedade de codificação MFPKEY_VIDEOWINDOW e o atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 no fluxo. Os valores de janela de buffer especificados são usados para garantir que o arquivo codificado tenha os tempos de envio corretos marcados nos pacotes de dados e que o valor de pré-registro apareça no Objeto de Cabeçalho ASF. É suficiente definir MF_ASFSTREAMCONFIG_LEAKYBUCKET1 porque esses valores especificados são copiados para o atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .

Para modos de codificação de 2 pass, você precisa definir ambos os atributos para especificar os valores médio e máximo.

Para codificação VBR, o aplicativo pode consultar os valores de bucket vazados usados pelo codificador somente após a conclusão da passagem de codificação. Portanto, ao configurar o coletor de mídia, o aplicativo pode optar por não definir os atributos ou propriedades relacionados a buckets com vazamento. Após a codificação, o aplicativo deve consultar o codificador para as propriedades MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX e MFPKEY_BMAX e defini-las no coletor de mídia para que os valores precisos sejam refletidos no Objeto Header. Para obter um exemplo de código sobre como atualizar os valores para codificação VBR, consulte "Atualizar propriedades de codificação no coletor de arquivos" no Tutorial: Codificação de Mídia do Windows de 1 passagem.

Se você estiver copiando o conteúdo do Windows Media da origem para o coletor de mídia sem codificação, os valores de bucket vazados deverão ser definidos no coletor de mídia.

Valores de bucket com vazamento no Multiplexer do ASF

No Media Foundation, os valores de bucket com vazamento são usados pelo Multiplexer do ASF para configurar os valores de bucket com vazamento interno que ele usa para gerar pacotes de dados. O conteúdo está contido em um exemplo de mídia e uma série de exemplos de mídia constitui um pacote de dados ASF. Com base nos valores de bucket com vazamento e no tempo de apresentação, o multiplexer atribui um tempo de envio para cada exemplo de mídia para que as taxas de bits dos pacotes que estão sendo enviados pela rede fiquem em uma taxa de bits constante (R).

Um aplicativo não pode definir valores de bucket com vazamento diretamente no multiplexer. Os valores devem ser fornecidos no coletor de mídia ASF, que define os valores apropriados no multiplexer. Os valores definidos em MF_ASFSTREAMCONFIG_LEAKYBUCKET1 e MF_ASFSTREAMCONFIG_LEAKYBUCKET2 são usados pelo multiplexer para validar se os exemplos enviados para o coletor de mídia ASF são gerados usando os valores especificados.

Atualizando valores de bucket com vazamento no coletor de mídia do ASF

Um aplicativo pode substituir os valores de bucket com vazamento no nível do fluxo (definidos no perfil do ASF durante a criação do fluxo) definindo a propriedade MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET no repositório de propriedades do coletor de mídia. Para obter uma referência ao repositório de propriedades, use o objeto ContentInfo implementado pelo coletor de mídia. Para obter mais informações, consulte Configurando propriedades no coletor de arquivos.

Nota Essa operação só é permitida para fluxos de áudio.

Essa propriedade deve ser definida depois que você definir o tipo de saída no codificador. Com base na taxa de bits definida no tipo de mídia, o codificador calcula o tamanho do buffer para garantir que os exemplos de mídia gerados nunca transbordem o buffer. O codificador faz os ajustes necessários durante a compactação para manter a taxa de bits dos exemplos compactados dentro dos limites descritos pela taxa de bits e pela janela de buffer.

Semelhante aos atributos de configuração de fluxo para buckets com vazamento, defina a taxa média de bits e o tamanho do buffer e a integridade inicial do buffer em uma matriz de DWORDs. Para obter mais informações, consulte a seção "Como definir valores de bucket com vazamento para fluxos ASF" neste tópico.

Suporte do ASF no Media Foundation

Codificações de mídia do Windows