Creación del objeto Multiplexer
El multiplexador ASF es un objeto de capa WMContainer que funciona con el objeto de datos ASF y proporciona a una aplicación la capacidad de generar paquetes de datos ASF para flujos multimedia.
El objeto multiplexador expone la interfaz IMFASFMultiplexer . Para crear el multiplexador, llame a MFCreateASFMultiplexer. Esta función devuelve un puntero a un objeto vacío. Si la aplicación está escribiendo un nuevo archivo ASF, la aplicación debe inicializar el multiplexador con un objeto ContentInfo. Para ello, llame a IMFASFMultiplexer::Initialize. El objeto ContentInfo especificado representa el objeto de encabezado ASF del nuevo archivo. Para obtener información sobre cómo crear e inicializar el objeto ContentInfo para un nuevo archivo, vea Inicializar el objeto ContentInfo de un nuevo archivo ASF.
El método Initialize analiza el objeto ContentInfo para recopilar información de configuración del flujo, como el número de secuencias, el tamaño del paquete, la inscripción previa. Opcionalmente, el multiplexador también podría necesitar parámetros de cubo filtrados y las unidades de extensión de carga. Esta información es necesaria para generar paquetes de datos que coincidan con los requisitos definidos en el objeto de encabezado ASF. El método Initialize configura el multiplexador en función del tipo de medio y los valores de configuración de las secuencias. Por ejemplo, si una secuencia está configurada para tener extensiones de carga (vea Crear y configurar secuencias ASF) y, a continuación, el multiplexador está configurado para agregar esos valores a los paquetes de datos generados.
El método Initialize también obtiene un identificador para el objeto de datos inicial que se creó durante la creación del objeto ContentInfo para escribir. Durante la generación de paquetes de datos, el multiplexador agrega paquetes al objeto de datos y los actualiza adecuadamente. Una vez que el multiplexador genera todos los paquetes de datos, actualiza el objeto ContentInfo proporcionado para que determinados valores, como el número de paquetes de datos, se actualicen.
En el ejemplo de código siguiente se muestra cómo crear un multiplexador e inicializarlo con un objeto ContentInfo.
//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the
// output file.
//-------------------------------------------------------------------
HRESULT CreateOutputGenerators(
IMFASFProfile *pProfile,
IMFASFContentInfo **ppContentInfo,
IMFASFMultiplexer **ppMux
)
{
IMFASFContentInfo *pContentInfo = NULL;
IMFASFMultiplexer *pMux = NULL;
// Use the ASF profile to create the ContentInfo object.
HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
if (SUCCEEDED(hr))
{
hr = pContentInfo->SetProfile(pProfile);
}
// Create the ASF Multiplexer object.
if (SUCCEEDED(hr))
{
hr = MFCreateASFMultiplexer(&pMux);
}
// Initialize it using the new ContentInfo object.
if (SUCCEEDED(hr))
{
hr = pMux->Initialize(pContentInfo);
}
// Return the pointers to the caller.
if (SUCCEEDED(hr))
{
*ppContentInfo = pContentInfo;
(*ppContentInfo)->AddRef();
*ppMux = pMux;
(*ppMux)->AddRef();
}
SafeRelease(&pContentInfo);
SafeRelease(&pMux);
return hr;
}
Para ver esta función usada en una aplicación completa, consulte Tutorial: Copia de secuencias ASF de un archivo a otro.
Configuración de cubos de multiplexación y inicialización de multiplexador
El método IMFASFMultiplexer::Initialize configura el multiplexador para determinar el flujo de datos del cubo filtrado. Para configurar estos parámetros, asegúrese de que los siguientes valores de propiedad se establecen en el objeto ContentInfo especificado. Para obtener información sobre cómo establecer estas propiedades, vea Establecer propiedades en el objeto ContentInfo.
MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE propiedad: indica si el multiplexador debe ajustar automáticamente la velocidad de bits para mantener el flujo de datos en el cubo filtrado. Esta configuración se puede cambiar mediante la aplicación llamando a IMFASFMultiplexer::SetFlags y pasando la marca de MFASF_MULTIPLEXER_AUTOADJUST_BITRATE .
MFPKEY_ASFMEDIASINK_BASE_SENDTIME propiedad: el tiempo de envío indica cuándo se liberará la carga dentro del cubo filtrado. Los tiempos de envío deben ser iguales o anteriores a la hora de presentación, ya que la carga debe tener tiempo para llegar al destino antes de la hora de presentación.
Este valor de propiedad es la primera vez que se envía. El multiplexador usa este valor para calcular los tiempos de envío posteriores para asegurarse de que los datos fluyen a través del cubo de forma constante. Si la marca de MFASF_MULTIPLEXER_AUTOADJUST_BITRATE se ha establecido en el multiplexador, el multiplexador ajustará la velocidad de bits para que la carga se envíe cuando la ventana del búfer esté cerca de estar llena. Si no se establece la marca, el multiplexador no puede generar paquetes de datos debido a la saturación del ancho de banda.
El multiplexador obtiene información de configuración del flujo del perfil de ASF asociado al objeto ContentInfo especificado en el método Initialize . La información de configuración del flujo incluye parámetros de cubo filtrados. El multiplexador requiere este valor para generar paquetes de datos.
Para especificar los parámetros de cubo filtrados, establezca los valores del atributo MF_ASFSTREAMCONFIG_LEAKYBUCKET1 en el objeto de configuración de flujo que representa la secuencia del perfil. Para usar el valor de la ventana de búfer, que usa el codificador, llame a IWMCodecLeakyBucket::GetBufferSizeBits. El valor real de la ventana del búfer solo se conoce después de establecer el tipo de medio de salida del codificador. Para obtener información sobre cómo establecer el tipo de medio de salida, vea Negociación de tipos de medios en el codificador.
Nota:
Los valores de cubo filtrados utilizados por el codificador pueden ser diferentes en el objeto ContentInfo proporcionado por el perfil de ASF que se usó para crear el multiplexador.
El método Initialize actualiza el objeto ContentInfo para que los valores correctos se reflejen en el objeto de encabezado ASF final.
Temas relacionados