El modelo de búfer de cubos filtrado (Microsoft Media Foundation)
Al transmitir medios a través de una red, el descodificador recibe datos codificados a una velocidad teóricamente constante (la velocidad de transmisión). El descodificador consume estos datos para generar una salida descodificada. Sin embargo, en el caso general, el descodificador consume los datos a una velocidad variable , ya que el codificador puede usar una velocidad de codificación variable.
El modelo de "cubo filtrado" es una manera de modelar los requisitos de almacenamiento en búfer para la reproducción fluida. En este modelo, el descodificador mantiene un búfer. Los datos codificados van de la red al búfer y del búfer al descodificador. Si los subflujos del búfer, significa que el descodificador quita los datos del búfer más rápido que la red lo entrega. Si el búfer se desborda, significa que la red entrega los datos más rápido que el descodificador lo consume.
En este tema se describe el modelo de "cubo filtrado" de búferes para codificar y descodificar.
- El cubo de fugas
- El cubo en uso
- Establecimiento de valores de cubo de fuga para flujos ASF
- Valores de cubo filtrado en el multiplexador ASF
- Actualización de los valores de cubo de fugas en el receptor de medios asf
- Temas relacionados
El cubo de fugas
Para comprender el modelo de cubo filtrado, considere la posibilidad de usar un cubo con un pequeño agujero en la parte inferior. Tres parámetros definen el cubo:
- Capacidad (B)
- Velocidad a la que fluye el agua fuera del cubo (R)
- La totalidad inicial del cubo (F)
En esta metáfora, el cubo es el búfer:
Si el agua se derrama en el cubo a la velocidad exacta de R, el cubo permanecerá en F, ya que la velocidad de entrada es igual a la velocidad de salida. Si la velocidad de entrada aumenta mientras R permanece constante, el cubo acumula agua. Si la velocidad de entrada es mayor que R durante un período sostenido, finalmente se desborda el cubo. Sin embargo, la velocidad de entrada puede variar alrededor de R sin desbordar el cubo, siempre y cuando la velocidad media de entrada no supere la capacidad del cubo. Cuanto mayor sea la capacidad, más la velocidad de entrada puede variar dentro de un período de tiempo determinado.
En ASF, el cubo filtrado se define mediante tres parámetros:
- Velocidad media de bits, en bytes por segundo, que corresponde a la velocidad de salida (R)
- Ventana del búfer, medida en milisegundos, que corresponde a la capacidad del cubo (B).
- La totalidad inicial del búfer, que generalmente se establece en cero.
La velocidad de bits mide el número medio de bits por segundo en la secuencia codificada. La ventana del búfer mide el número de milisegundos de datos a esa velocidad de bits que puede caber en el búfer. El tamaño del búfer en bits es igual a R * (B / 1000).
Los datos de carga de ASF pueden entrar en el cubo fugado en momentos irregulares y en cantidades irregulares, pero deben dejar el cubo a una velocidad de bits positiva constante. Debido a la ventana del búfer, hay un posible retraso entre el tiempo en que la carga entra en el cubo y cuando sale. El retraso máximo que puede producirse es B/R. Los datos de carga que entran en el cubo son según el tiempo de presentación y nunca deben desbordar el cubo. Además del tiempo de presentación, cada carga también tiene un tiempo de envío: la hora en la que los datos de carga salen del cubo según la velocidad de bits. El tiempo de envío debe ser anterior al tiempo de presentación para asegurarse de que, cuando el cubo filtrado se acerca a estar lleno, cada carga deja el cubo antes o en su momento de presentación. Para ello, los tiempos de presentación se desplazan por delante por el valor de B/R (el preroll) y los tiempos de envío obtienen un inicio inicial a partir de cero. El tiempo de envío no debe ser posterior a la hora de presentación, ya que eso indicaría que la carga entró demasiado tarde en el cubo y no se puede incluir en el objeto de datos. El valor de inscripción previa se incluye en el objeto de encabezado ASF .
Para el streaming sin problemas a través de la red, las secuencias comprimidas dentro del contenido multimedia deben mantener una velocidad de bits constante durante toda la duración de la reproducción. El modelo de cubo filtrado de ASF garantiza que los datos multimedia se envían a través de la red a una velocidad de bits constante. Los parámetros del cubo filtrado se especifican en el objeto Propiedades de flujo extendidas del objeto de encabezado ASF. En Microsoft Media Foundation, se establecen como atributos en el tipo de medio que representa la secuencia.
Los valores de cubo filtrados se definen tanto en el receptor de archivos ASF como en el objeto multiplexador ASF subyacente y en el codificador de Windows Media. Estos valores podrían ser iguales o diferentes. Por ejemplo, considere un escenario de streaming, que requiere que las muestras de audio se entreguen más adelante que las muestras de vídeo para que el archivo se pueda transmitir sin latencia. Para lograrlo, el cubo de fugas de la secuencia de audio en el receptor multimedia se puede establecer en un valor superior al establecido en el codificador de audio de Windows Media.
Para establecer valores B/R en el codificador, la aplicación debe establecer las propiedades MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX y MFPKEY_BMAX . Para obtener información sobre cómo establecer propiedades en el codificador, vea Propiedades de codificación.
El cubo en uso
El objetivo de un codificador es asegurarse de que el contenido nunca desborda el búfer. El codificador usa los valores de la ventana de velocidad de bits y búfer como guías. El número real de bits pasados durante cualquier período de tiempo igual a la ventana del búfer nunca puede ser mayor que el doble del tamaño del búfer.
Considere el ejemplo siguiente: Tiene un cubo de 3 galones con un agujero en él a través del cual 1 galón puede fluir por minuto. Colocas el cubo bajo un espigot y abres la válvula para dejar salir agua a una velocidad de 1 galón por minuto. El agua fluye fuera del cubo tan rápido como entra, sin dejar ningún adicional en el cubo. A continuación, aumenta el flujo desde el pico hasta 2 galones por minuto. Cada minuto que el agua fluye a este ritmo, 2 galones van al cubo y 1 galón se filtran, dejando 1 galón en el cubo. Al final de 3 minutos, 6 galones de agua han ido al cubo, 3 galones se han filtrado y el cubo está lleno.
En la práctica, la velocidad de datos máxima teórica durante un intervalo igual a la ventana del búfer nunca se logra. En el ejemplo anterior se presupone una velocidad de datos constante. Dado el mismo cubo de 3 galones, podría aumentar la velocidad de flujo desde el pico hasta 6 galones por minuto durante un minuto y, a continuación, desactivar el pico durante dos minutos. Aunque la cantidad total de agua puesta en el cubo se encuentra dentro del máximo teórico para la ventana de búfer, la concentración de esa cantidad en una parte de la ventana hace que el cubo se desborde. A 6 galones por minuto, el cubo de 3 galones se desborda poco después de 30 segundos de paso. Por lo tanto, la cantidad máxima real de datos que se pueden entregar al búfer durante la duración de cualquier intervalo igual a la configuración de la ventana del búfer depende del tamaño de las muestras individuales y de cuándo se entregan.
Hasta ahora, los ejemplos solo han analizado el búfer usado por el descodificador, pero el codificador también usa un búfer de cubo filtrado que crea el contenido comprimido. El codificador realiza los ajustes necesarios para los algoritmos de compresión para mantener la velocidad de bits de las muestras comprimidas dentro de los límites descritos por la velocidad de bits y la ventana del búfer, suponiendo que las muestras se entregarán al descodificador a una velocidad constante. Puede pensar en el cubo del codificador como reflejo del cubo de descodificador. El cubo del codificador se rellena a una velocidad variable determinada por el tamaño de las muestras individuales y fugas a una velocidad constante igual a la velocidad de bits promedio.
Considere el ejemplo siguiente de un codificador y un descodificador conectados juntos a través de una red. Codifica un archivo de vídeo con 30 fotogramas por segundo con una velocidad de bits de 6000 bits por segundo y una ventana de búfer de 3 segundos (un tamaño total de búfer de 18 000 bits). La primera muestra se codifica como fotograma clave y ocupa 7000 bits. El búfer del codificador ahora contiene 7000 bits. Los 29 fotogramas siguientes son todos los fotogramas delta que su total son de 3000 bits. Por lo tanto, el primer segundo de contenido (30 fotogramas) colocaría la totalidad del búfer en 10 000 bits si nada se filtrase. Sabemos que la velocidad de bits de la secuencia es de 6000 bits por segundo, por lo que después del primer segundo de contenido codificado se coloca en el búfer del codificador, la totalidad cae a 4000 bits. En la aplicación de descodificación, esta secuencia se entrega al búfer de descodificador en 6000 bits por segundo. Después de un segundo, el búfer contiene 6000 bits. La primera muestra contiene 7000 bits, por lo que el búfer del descodificador debe rellenarse más antes de que el descodificador comience a quitar muestras.
Establecimiento de valores de cubo de fuga para flujos ASF
En un escenario de codificación de archivos, una aplicación puede establecer los valores de cubo filtrados al configurar las secuencias en el perfil de ASF.
Después de crear la secuencia y tener una referencia a la interfaz IMFASFStreamConfig de la secuencia, puede establecer los valores mediante los siguientes atributos:
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (promedio de valores de cubo filtrado)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (valores máximos de cubo filtrado)
Para obtener información sobre cómo agregar flujos y obtener el puntero IMFASFStreamConfig , vea Agregar información de flujo al receptor de archivos ASF.
Estos valores contienen el siguiente conjunto de información:
- Velocidad media de bits: obtenga la velocidad media de bits del tipo de medio de salida seleccionado durante la negociación de tipo multimedia. Use el atributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (para secuencias de audio) o el atributo MF_MT_AVG_BITRATE (para secuencias de vídeo).
- Ventana de búfer: si tiene una instancia del codificador y ha negociado tipos de medios de salida, puede actualizar este valor más adelante consultando el codificador para la interfaz IWMCodecLeakyBucket y, a continuación, llamando a IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). De lo contrario, use el valor predeterminado de 3000 milisegundos.
- Tamaño inicial del búfer: establezca en 0.
Los valores proporcionados por la aplicación dependen del tipo de codificación y del tipo de medio de la secuencia. Por ejemplo, la codificación de velocidad de bits constante requiere una velocidad de bits fija predeterminada y una ventana de búfer. La aplicación puede especificar estos valores de cubo filtrados estableciendo la propiedad de codificación MFPKEY_VIDEOWINDOW y el atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 en la secuencia. Los valores de ventana de búfer especificados se usan para asegurarse de que el archivo codificado tiene los tiempos de envío correctos marcados en los paquetes de datos y el valor de inscripción previa aparece en el objeto de encabezado ASF. Es suficiente establecer MF_ASFSTREAMCONFIG_LEAKYBUCKET1 porque estos valores especificados se copian en el atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .
Para los modos de codificación de 2 pasos, debe establecer ambos atributos para especificar los valores promedio y máximo.
Para la codificación de VBR, la aplicación puede consultar los valores de cubo filtrados usados por el codificador solo después de que se complete el paso de codificación. Por lo tanto, al configurar el receptor de medios, la aplicación puede optar por no establecer los atributos o propiedades relacionados con cubos filtrados. Después de la codificación, la aplicación debe consultar al codificador para el MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX y MFPKEY_BMAX propiedades y establecerlas en el receptor multimedia para que los valores precisos se reflejen en el objeto Header. Para obtener un ejemplo de código sobre cómo actualizar los valores para la codificación de VBR, vea "Actualizar propiedades de codificación en el receptor de archivos" en Tutorial: Codificación de Windows Media de 1 paso.
Si va a copiar contenido de Windows Media desde el origen al receptor de medios sin codificación, los valores de cubo filtrados deben establecerse en el receptor de medios.
Valores de cubo filtrado en el multiplexador ASF
En Media Foundation, el multiplexador asf usa los valores de cubo filtrados para configurar los valores internos del cubo de fuga que usa para generar paquetes de datos. La carga está contenida en un ejemplo multimedia y una serie de muestras de medios constituye un paquete de datos ASF. En función de los valores de cubo filtrados y el tiempo de presentación, el multiplexador asigna un tiempo de envío para cada muestra multimedia para que las velocidades de bits de los paquetes que se envían a través de la red estén a una velocidad de bits constante (R).
Una aplicación no puede establecer valores de cubo filtrado directamente en el multiplexador. Los valores deben proporcionarse en el receptor de medios ASF, que establece los valores adecuados en el multiplexador. El multiplexador usa los valores establecidos en MF_ASFSTREAMCONFIG_LEAKYBUCKET1 y MF_ASFSTREAMCONFIG_LEAKYBUCKET2 para validar que los ejemplos enviados al receptor de medios ASF se generan mediante los valores especificados.
Actualización de los valores de cubo de fugas en el receptor de medios asf
Una aplicación puede sobrescribir los valores de cubo de fuga de nivel de flujo (establecidos en el perfil de ASF durante la creación de flujos) estableciendo la propiedad MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET en el almacén de propiedades del receptor multimedia. Para obtener una referencia al almacén de propiedades, use el objeto ContentInfo implementado por el receptor de medios. Para obtener más información, vea Establecer propiedades en el receptor de archivos.
Nota Esta operación solo se permite para secuencias de audio.
Esta propiedad debe establecerse después de haber establecido el tipo de salida en el codificador. En función de la velocidad de bits establecida en el tipo de medio, el codificador calcula el tamaño del búfer para asegurarse de que las muestras de medios generadas nunca desbordan el búfer. El codificador realiza los ajustes necesarios durante la compresión para mantener la velocidad de bits de las muestras comprimidas dentro de los límites descritos por la velocidad de bits y la ventana del búfer.
De forma similar a los atributos de configuración de flujo para cubos filtrados, establezca la velocidad de bits promedio y el tamaño del búfer, y la totalidad inicial del búfer en una matriz de DWORDs. Para obtener más información, vea la sección "Establecer valores de cubo de fuga para flujos asf" en este tema.
Temas relacionados