O modelo de buffer de bucket com vazamento (Microsoft Media Foundation)
Quando você transmite mídia através de 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 de , porque o codificador pode então usar uma taxa de codificação variável.
O modelo de "balde com vazamento" é uma maneira de modelar os requisitos de buffer para uma reprodução suave. Neste modelo, o descodificador mantém uma memória intermédia. Os dados codificados vão da rede para o buffer e do buffer para o decodificador. Se o buffer não consegue encher, isso significa que o decodificador está removendo dados do buffer mais rápido do que a rede está a entregá-los. Se o buffer transbordar, significa que a rede está fornecendo dados mais rápido 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 balde vazado
- O balde em uso
- Definindo valores de bucket com vazamento para fluxos ASF
- valores de bucket com vazamento no do multiplexador ASF
- Atualização de valores de bucket com vazamento no do coletor de mídia ASF
- Tópicos relacionados
Para entender o modelo de balde com vazamento, considere um balde com um pequeno orifício na parte inferior. Três parâmetros definem o bucket:
- A capacidade (B)
- A velocidade a que a água flui para fora do balde (R)
- A plenitude inicial do balde (F)
Nesta metáfora, o balde é o tampão:
Se a água for despejada no balde a uma taxa exatamente de R, o balde permanecerá no estado F, porque a taxa de entrada é igual à taxa de saída. Se a taxa de entrada aumenta enquanto R permanece constante, o balde acumula água. Se a taxa de entrada for maior que R por um período sustentado, eventualmente a caçamba transborda. No entanto, a taxa de entrada pode variar em torno de R sem transbordar a caçamba, desde que a taxa média de entrada não exceda a capacidade da caçamba. Quanto maior a capacidade, mais a taxa de entrada pode variar dentro de uma determinada janela de tempo.
No ASF, o balde com vazamento é definido por três parâmetros:
- A taxa de bits média, em bytes por segundo, corresponde à taxa de saída (R)
- A janela de buffer, medida em milissegundos, que corresponde à capacidade do bucket (B).
- A plenitude 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 nessa taxa de bits que pode caber no buffer. O tamanho do buffer em bits é igual a R * (B / 1000).
Os dados de carga útil ASF podem entrar na caçamba com vazamento em momentos irregulares e em quantidades irregulares, mas devem deixar a caçamba a uma taxa de bits positiva constante. Devido à janela do buffer, há um possível atraso entre o momento em que a carga entra no bucket e quando ela sai. O atraso máximo que pode ocorrer é B/R. Os dados de carga útil que entram no bucket estão de acordo com o tempo de apresentação e nunca devem transbordar o bucket. Além do tempo de apresentação, cada conjunto de dados também tem um tempo de envio — o tempo em que os dados saem do reservatório de acordo com a taxa de bits. O tempo de envio deve ser anterior ao tempo de apresentação de forma a garantir que, assim que o balde gotejante estiver perto de estar cheio, cada carga útil saia do balde antes ou no momento da apresentação. Para conseguir isso, os tempos de apresentação são deslocados à frente pelo valor B/R (o preroll), e os tempos de envio obtêm uma vantagem inicial começando em zero. O tempo de envio não deve ser posterior ao tempo de apresentação, pois isso indicaria que a carga entrou no bucket muito tarde e não pode ser incluída no objeto de dados. O valor de preroll está incluído no Objeto de Cabeçalho ASF .
Para streaming sem falhas pela 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 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 Extended Stream Properties Object do ASF Header Object. No Microsoft Media Foundation, eles são definidos como atributos no tipo de mídia que representa o fluxo.
Os valores do buffer de vazamento são definidos tanto no coletor de ficheiros ASF quanto no objeto multiplexador ASF subjacente, e também no codificador Windows Media. Estes valores podem ser iguais ou diferentes. Por exemplo, considere um cenário de streaming, que exige que as amostras de áudio sejam entregues posteriormente às amostras de vídeo para que o arquivo possa ser transmitido sem latência. Para conseguir isso, o bucket de vazamento 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_RMAXe MFPKEY_BMAX. Para obter informações sobre como definir propriedades no codificador, consulte Encoding Properties.
O objetivo de um codificador é garantir que o conteúdo nunca exceda 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 do buffer nunca pode ser maior do que o dobro do tamanho do buffer.
Considere o seguinte exemplo: Você tem um balde de 3 galões com um furo através do qual 1 galão pode fluir por minuto. Coloque o balde debaixo de uma torneira e abra a válvula para deixar sair á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 da torneira para 2 galões por minuto. A cada minuto que a água flui a este ritmo, 2 galões vão para o balde e 1 galão vaza, deixando 1 galão no balde. Ao final de 3 minutos, 6 galões de água foram para o 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 de buffer nunca é alcançada. O exemplo anterior pressupunha uma taxa de dados constante. Dado o mesmo balde de 3 galões, você pode aumentar a taxa de fluxo da torneira para 6 galões por minuto durante um minuto e, em seguida, desligar a torneira por dois minutos. Mesmo que a quantidade total de água colocada no balde esteja dentro do máximo teórico para a janela tampão, 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 transborda pouco depois de passarem 30 segundos. Portanto, a quantidade máxima real de dados que podem ser entregues ao buffer durante a duração de qualquer intervalo igual à configuração da janela do buffer depende do tamanho das amostras individuais e de 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 compressão para manter a taxa de bits das amostras comprimidas dentro dos limites descritos pela taxa de bits e janela de buffer, assumindo que as amostras serão entregues ao decodificador a uma taxa constante. Você pode imaginar o balde do codificador como um reflexo do balde do decodificador. O bucket do codificador é preenchido a uma taxa variável determinada pelo tamanho das amostras individuais e vaza a uma taxa constante igual à taxa de bits média.
Considere o exemplo a seguir de um codificador e um decodificador conectados juntos 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. Assim, o primeiro segundo de 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 de 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. A primeira amostra contém 7.000 bits, portanto, o buffer do decodificador deve ser preenchido mais antes que o decodificador comece a remover amostras.
Em um cenário de codificação de arquivo, um aplicativo pode definir os valores de bucket com vazamento ao configurar os fluxos no de perfil ASF.
Depois de criar o fluxo e ter uma referência à interface deIMFASFStreamConfig do fluxo, você pode definir os valores usando os seguintes atributos:
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (valores médios de balde com fugas)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (valores máximos de leaky bucket)
Para obter informações sobre como adicionar fluxos e obter o ponteiro de IMFASFStreamConfig, consulte Adicionar Informações de Fluxo ao Coletor de Arquivos ASF.
Esses valores contêm o seguinte conjunto de informações:
- Taxa de bits média: obtenha a taxa de bits média do tipo de mídia de saída selecionado durante o processo de negociação do 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 posteriormente consultando o codificador para a interfaceIWMCodecLeakyBucket e, em seguida, 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, Codificação de Taxa de Bits Constante requer uma taxa de bits fixa predeterminada e uma janela de buffer. A aplicação pode especificar estes valores de "leaky bucket" ao definir a propriedade de codificação MFPKEY_VIDEOWINDOW e o atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 no fluxo. Os valores da janela de buffer especificada são usados para garantir que o arquivo codificado tenha os tempos de envio corretos marcados nos pacotes de dados e que o valor preroll 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 passos, 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 com vazamento usados pelo codificador somente após a conclusão do passo 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_RMAXe MFPKEY_BMAX e defini-las no coletor de mídia para que os valores precisos sejam refletidos no objeto de cabeçalho. Para obter um exemplo de código sobre como atualizar os valores da codificação VBR, consulte "Atualizar propriedades de codificação no receptor de arquivos" em Tutorial: 1-Pass Windows Media Encoding.
Se você estiver copiando conteúdo do Windows Media da origem para o coletor de mídia sem codificação, os valores do bucket com vazamento deverão ser definidos no coletor de mídia.
No Media Foundation, os valores de bucket com vazamento são usados pelo ASF Multiplexer para configurar os valores internos de bucket com vazamento que utiliza para gerar pacotes de dados. A carga útil está contida em uma amostra de mídia e uma série de amostras de mídia constitui um pacote de dados ASF. Com base nos valores de bucket com vazamento e no tempo de apresentação, o multiplexador atribui um tempo de envio para cada amostra de mídia para que as taxas de bits dos pacotes que estão sendo enviados pela rede estejam em uma taxa de bits constante (R).
Um aplicativo não pode definir valores de bucket com vazamento no multiplexador diretamente. Os valores devem ser fornecidos no coletor de mídia ASF, que define os valores apropriados no multiplexador. Os valores definidos em MF_ASFSTREAMCONFIG_LEAKYBUCKET1 e MF_ASFSTREAMCONFIG_LEAKYBUCKET2 são usados pelo multiplexador para validar que as amostras enviadas para a unidade de mídia ASF são geradas usando os valores especificados.
Um aplicativo pode substituir os valores de bucket com vazamento no nível de fluxo (definidos no perfil 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 Propriedades de configuração noColetor de arquivos .
Nota Esta operação só é permitida para fluxos de áudio.
Esta propriedade deve ser definida depois de 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 as amostras de mídia geradas nunca excedam o buffer. O codificador faz os ajustes necessários durante a compactação para manter a taxa de bits das amostras compactadas dentro dos limites descritos pela taxa de bits e janela de buffer.
Semelhante aos atributos de configuração de fluxo para buckets com fugas, defina a taxa de bits média, o tamanho do buffer e a plenitude inicial do buffer numa matriz de DWORDs. Para obter mais informações, consulte a seção "Configuração de valores do Leaky Bucket para fluxos ASF" neste assunto.