Compartir a través de


Agregar información de flujo al receptor de archivos ASF

El receptor de archivos ASF es una implementación de IMFMediaSink proporcionada por Media Foundation que una aplicación puede usar para archivar los datos multimedia de ASF en un archivo. Para obtener información sobre el modelo de objetos de los receptores multimedia de ASF y el uso general, vea Receptores multimedia de ASF.

Después de crear una instancia del receptor de archivos, debe configurarse antes de compilar la topología. El receptor de archivos debe conocer las secuencias del archivo de salida, la información del modo de codificación y los metadatos. En este tema se describe el proceso de agregar secuencia en el receptor de archivos.

Agregar secuencias en el receptor de archivos ASF

El receptor de archivos debe conocer los flujos de salida y sus propiedades para que pueda generar ejemplos de salida en consecuencia y agregarlos al archivo ASF de salida. Esta configuración se escribe en el objeto de encabezado ASF final.

Para establecer la información de la secuencia, debe tener una referencia al objeto ContentInfo del receptor de archivos. Para obtener información, vea Crear el receptor de archivos ASF.

En el procedimiento siguiente se resumen los pasos generales para configurar el flujo mediante el objeto de perfil ASF.

Para configurar la información de flujo en el receptor de archivos ASF

  1. Cree un objeto de perfil asf llamando a MFCreateASFProfile.

  2. Para cada secuencia del archivo de salida, cree un tipo de medio para la secuencia de destino que se va a agregar en el receptor de archivos. El tipo de medio debe ser compatible con los tipos de salida admitidos por los codificadores de Windows Media.

    Para obtener información sobre cómo agregar secuencias de audio al perfil, vea Creating Audio Streams for ASF Encoding.

    Para obtener información sobre cómo agregar secuencias de vídeo al perfil, vea Creating Video Streams for ASF Encoding.

  3. Cree secuencias basadas en los tipos de medios creados en el paso 2 mediante una llamada a IMFASFProfile::CreateStream.

  4. Asigne un número de secuencia para la secuencia recién creada mediante una llamada al puntero de interfaz IMFASFStreamConfig recibido en el paso 3.

  5. Opcionalmente, configure la secuencia con la siguiente información:

  6. Opcionalmente, establezca el tamaño del paquete de datos para el perfil estableciendo MF_ASFPROFILE_MINPACKETSIZE y atributos de MF_ASFPROFILE_MAXPACKETSIZE . El perfil de ASF expone la interfaz IMFAttributes , a la que una aplicación puede obtener referencia mediante una llamada a IMFASFProfile::QueryInterface.

  7. Establezca la información de codificación para la secuencia en el receptor de archivos. Se describe en Establecer propiedades en el receptor de archivos.

  8. Agregue la secuencia al perfil llamando a IMFASFProfile::SetStream.

  9. Asocie el perfil al objeto ContentInfo llamando a IMFASFContentInfo::SetProfile.

Para modificar una secuencia existente, la aplicación puede obtener una referencia a la interfaz IMFASFStreamConfig de la secuencia y volver a configurarla según los requisitos. Para agregar o quitar secuencias, la aplicación debe llamar a IMFASFProfile::RemoveStream. Para aplicar estos cambios, modificaciones de secuencia o eliminación, debe volver a establecer el perfil en el objeto ContentInfo. Esto sobrescribe el perfil existente que ya está asociado al objeto ContentInfo.

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

Enumeración de receptores de flujo

Para cada secuencia del perfil del que conoce el objeto ContentInfo, el receptor de archivos ASF crea y agrega un receptor de secuencia que contiene todas las propiedades de la secuencia codificada. El receptor de archivos ASF está diseñado para contener secuencias fijas. Esto significa que no puede agregar o quitar secuencias llamando a IMFMediaSink::AddStreamSink o IMFMediaSink::RemoveStreamSink. Estas llamadas en el receptor de archivos producen un error con el código de error MF_E_STREAMSINKS_FIXED. Agregar o quitar secuencias en el perfil no agrega ni quita automáticamente los receptores de secuencias en el receptor de archivos. Debe descartar la instancia existente del archivo y volver a crearla con la nueva información de flujo si las secuencias del perfil han cambiado.

En el procedimiento siguiente se resumen los pasos generales para enumerar los receptores de flujo en el receptor de archivos ASF.

Para enumerar receptores de flujos

  1. Llame a IMFMediaSink::GetStreamSinkCount para obtener el número total de receptores de flujo en el receptor de archivos ASF.

  2. Recorra en bucle los receptores de flujo que obtienen una referencia a la interfaz GetStreamSinkByIndex del receptor de la secuencia.

    O bien

    Llame a IMFMediaSink::GetStreamSinkById para obtener el receptor de la secuencia especificando el número de secuencia. Cada receptor de secuencia se identifica con el número de secuencia que estableció al crear la secuencia en el perfil.

Si va a crear una topología parcial para codificar un archivo multimedia, debe agregar el receptor de archivos a la topología como nodo de topología de salida. Puede hacerlo especificando cada receptor de vapor en el receptor de archivos o estableciendo el objeto de activación del receptor de archivos y los identificadores del receptor de flujo. Para obtener más información y ejemplo de código, consulte Creating Output Nodes(Creación de nodos de salida).

Receptores de medios asf

Compatibilidad con ASF en Media Foundation