Compartir a través de


Generación de nuevos paquetes de datos asf

El multiplexador ASF es un componente 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 una secuencia que coincida con los requisitos definidos en el objeto ContentInfo.

El multiplexador tiene una entrada y una salida. Recibe un ejemplo de secuencia que contiene datos multimedia digitales y genera uno o varios paquetes de datos que se pueden escribir en un contenedor ASF.

En la lista siguiente se resume el proceso de generación de paquetes de datos de ASF:

  1. Pase datos de entrada al multiplexador en IMFASFMultiplexer::P rocessSample.
  2. Recopile los paquetes de datos llamando a IMFASFMultiplexer::GetNextPacket en un bucle hasta que se hayan recuperado todos los paquetes completos.
  3. Una vez que los datos de entrada se han convertido en paquetes completos, es posible que haya algunos datos pendientes en el multiplexador, que GetNextPacket no recuperó. Llame a IMFASFMultiplexer::Flush para empaquetar las muestras pendientes y recopilarlas del multiplexador llamando de nuevo a GetNextPacket .
  4. Actualice los objetos de encabezado ASF asociados llamando a IMFASFMultiplexer::End para reflejar los cambios realizados por el multiplexador durante la generación de paquetes de datos.

En el diagrama siguiente se muestra la generación de paquetes de datos para un archivo ASF a través del multiplexador.

diagram showing data packet generation for an asf file

Creación de paquetes de datos de ASF

Después de crear e inicializar el multiplexador como se describe en Creación del objeto multiplexador, llame a IMFASFMultiplexer::P rocessSample para pasar datos de entrada al multiplexador para su procesamiento en paquetes de datos. La entrada especificada debe estar en un ejemplo multimedia (interfaz IMFSample ) que pueda tener uno o varios búferes multimedia (interfaz IMFMediaBuffer ) que contengan los datos de una secuencia. En el caso de la transcodificación ASF a ASF, la muestra de medios de entrada se puede generar a partir del divisor que crea muestras de secuencia en paquetes. Para obtener más información, vea ASF Splitter.

Antes de llamar a ProcessSample, asegúrese de que la marca de tiempo del ejemplo de medios de entrada es una hora de presentación válida; De lo contrario , ProcessSample produce un error y devuelve el código MF_E_NO_SAMPLE_TIMESTAMP.

El multiplexador puede aceptar la entrada como muestras de medios comprimidos o sin comprimir a través de ProcessSample. El multiplexador asigna horas de envío a estos ejemplos en función del uso de ancho de banda de la secuencia. Durante este proceso, el multiplexador comprueba los parámetros de cubo filtrados (frecuencia de bits y uso de la ventana del búfer) y puede rechazar muestras que no cumplan esos valores. El ejemplo de medios de entrada puede producir un error en la comprobación de ancho de banda por cualquiera de los siguientes motivos:

  • Si el ejemplo de medios de entrada llegó tarde porque el tiempo de envío asignado por última vez es mayor que la marca de tiempo en este ejemplo multimedia. ProcessSample produce un error y devuelve el código de error MF_E_LATE_SAMPLE .
  • Si la marca de tiempo en el ejemplo de medios de entrada es anterior al tiempo de envío asignado (esto indica el desbordamiento del búfer). El multiplexador puede omitir esta situación si está configurado para ajustar la velocidad de bits estableciendo la marca de MFASF_MULTIPLEXER_AUTOADJUST_BITRATE durante la inicialización del multiplexador. Para obtener más información, vea "Multiplexer Initialization and Leaky Bucket Configuración" en Creating the Multiplexer Object. Si no se establece esta marca y el multiplexador encuentra la saturación de ancho de banda, ProcessSample produce un error y devuelve el código de error MF_E_BANDWIDTH_OVERRUN .

Una vez que el multiplexador asigna el tiempo de envío, el ejemplo de medios de entrada se agrega a la ventana de envío: una lista de muestras de medios de entrada ordenadas por horas de envío y listas para procesarse en paquetes de datos. Durante la construcción de paquetes de datos, la muestra de medios de entrada se analiza y los datos pertinentes se escriben en un paquete de datos como carga. Un paquete de datos completo puede contener datos de uno o varios ejemplos de medios de entrada.

Cuando llegan nuevos ejemplos de medios de entrada en la ventana de envío, se agregan a una cola hasta que haya suficientes muestras multimedia para formar un paquete completo. Los datos de los búferes multimedia contenidos en el ejemplo de medios de entrada no se copian en el paquete de datos generado. Las referencias del paquete de datos a los búferes de medios de entrada hasta que la muestra de medios de entrada se haya paqueteizado por completo y se haya recopilado el paquete completo del multiplexador.

Cuando hay disponible un paquete de datos completo, se puede recuperar llamando a IMFASFMultiplexer::GetNextPacket. Si llama a ProcessSample mientras hay paquetes completos listos para la recuperación, se produce un error y devuelve el código de error MF_E_NOTACCEPTING . Esto indica que el multiplexador no puede aceptar más entradas y debe llamar a GetNextPacket para recuperar los paquetes en espera. Idealmente, cada llamada a ProcessSample debe ir seguida de una o varias llamadas GetNextPacket para obtener los paquetes de datos completos. Puede tardar más de un ejemplo de medios de entrada para crear un paquete de datos completo. Por el contrario, los datos de una muestra de medios de entrada pueden abarcar varios paquetes. Por lo tanto, no todas las llamadas a ProcessSample producirán muestras de medios de salida.

Si el ejemplo de medios de entrada contiene un fotograma clave indicado por el atributo MFSampleExtension_CleanPoint , el multiplexador copia el atributo en el paquete.

Obtención de paquetes de datos de ASF

Para recopilar los ejemplos de medios de salida para un paquete de datos completo generado por el multiplexador, llame a IMFASFMultiplexer::GetNextPacket en un bucle hasta que no haya más muestras de medios de salida restantes para el paquete. A continuación se enumeran los casos de éxito:

  • Si hay disponible un paquete de datos completo, GetNextPacket recibe la marca ASF_STATUS_FLAGS_INCOMPLETE en el parámetro pdwStatusFlags ; El parámetro ppIPacket recibe un puntero al primer paquete de datos. Debe llamar a este método siempre que reciba esta marca. Con cada iteración, ppIPacket apunta al siguiente paquete de la cola.
  • Si solo hay un paquete de datos, ppIPacket apunta a él y la marca ASF_STATUS_FLAGS_INCOMPLETE no se recibe en pdwStatusFlags.
  • GetNextPacket puede realizarse correctamente sin producir ningún paquete de datos si el multiplexador todavía está en proceso de empaquetar y agregar paquetes de datos. En este caso, ppIPacket apunta a NULL. Para continuar, debe proporcionar el multiplexador con más ejemplos de medios de entrada llamando a ProcessSample.

En el código de ejemplo siguiente se muestra una función que genera paquetes de datos mediante el multiplexador. El contenido del paquete de datos generado se escribirá en el flujo de bytes de datos asignado por el autor de la llamada.

//-------------------------------------------------------------------
// GenerateASFDataPackets
// 
// Gets data packets from the mux. This function is called after 
// calling IMFASFMultiplexer::ProcessSample. 
//-------------------------------------------------------------------

HRESULT GenerateASFDataPackets( 
    IMFASFMultiplexer *pMux, 
    IMFByteStream *pDataStream
    )
{
    HRESULT hr = S_OK;

    IMFSample *pOutputSample = NULL;
    IMFMediaBuffer *pDataPacketBuffer = NULL;

    DWORD dwMuxStatus = ASF_STATUSFLAGS_INCOMPLETE;

    while (dwMuxStatus & ASF_STATUSFLAGS_INCOMPLETE)
    {
        hr = pMux->GetNextPacket(&dwMuxStatus, &pOutputSample);

        if (FAILED(hr))
        {
            break;
        }

        if (pOutputSample)
        {
            //Convert to contiguous buffer
            hr = pOutputSample->ConvertToContiguousBuffer(&pDataPacketBuffer);
            
            if (FAILED(hr))
            {
                break;
            }

            //Write buffer to byte stream
            hr = WriteBufferToByteStream(pDataStream, pDataPacketBuffer, NULL);

            if (FAILED(hr))
            {
                break;
            }
        }

        SafeRelease(&pDataPacketBuffer);
        SafeRelease(&pOutputSample);
    }

    SafeRelease(&pOutputSample);
    SafeRelease(&pDataPacketBuffer);
    return hr;
}

La WriteBufferToByteStream función se muestra en el tema IMFByteStream::Write.

Para ver una aplicación completa que usa este ejemplo de código, vea Tutorial: Copiar ASF Secuencias de un archivo a otro.

Publicar llamadas a Packet-Generation

Para asegurarse de que no haya paquetes de datos completos en espera en el multiplexador, llame a IMFASFMultiplexer::Flush. Esto obliga al multiplexador a paquetes de todas las muestras multimedia que están en curso. La aplicación puede recopilar estos paquetes en forma de muestras multimedia a través de GetNextPacket en un bucle hasta que no quedan más paquetes para recuperarse.

Una vez generadas todas las muestras de medios, llame a IMFASFMultiplexer::End para actualizar el objeto de encabezado ASF asociado a estos paquetes de datos. El objeto Header se especifica pasando el objeto ContentInfo que se usó para inicializar el multiplexador. Esta llamada actualiza varios objetos de encabezado para reflejar los cambios realizados por el multiplexador durante la generación de paquetes de datos. Esta información incluye el recuento de paquetes, la duración de envío, la duración de la reproducción y los números de secuencia de todas las secuencias. El tamaño general del encabezado también se actualiza.

Debe asegurarse de que se llama a End después de recuperar todos los paquetes de datos. Si hay paquetes en espera en el multiplexador, end producirá un error y devolverá el código de error MF_E_FLUSH_NEEDED . En este caso, obtenga el paquete en espera llamando a Flush y GetNextPacket en un bucle.

Nota

Para la codificación de VBR, después de llamar a End, debe establecer las estadísticas de codificación en las propiedades de codificación del objeto ContentInfo. Para obtener información sobre este proceso, vea "Configuring the ContentInfo Object with Encoder Configuración" in Setting Properties in the ContentInfo Object. En la lista siguiente se muestran las propiedades específicas que se van a establecer:

  • MFPKEY_RAVG es la velocidad media de bits del contenido de VBR.
  • MFPKEY_BAVG es la ventana de búfer para la velocidad media de bits.
  • MFPKEY_RMAX es la velocidad de bits máxima del contenido de VBR.
  • MFPKEY_BMAX es la ventana de búfer máxima.

 

Multiplexador ASF

Tutorial: Copiar asf Secuencias de un archivo a otro

Tutorial: Escritura de un archivo WMA mediante codificación CBR