Compartir a través de


Uso del origen del secuenciador

En este tema se describe cómo usar el origen del secuenciador. Contiene las siguientes secciones:

Para obtener información general sobre el origen del secuenciador, consulte Acerca del origen del secuenciador.

Información general

El origen del secuenciador expone las interfaces siguientes.

Interfaz Descripción
IMFMediaSource Expone la funcionalidad de origen multimedia genérico.
IMFSequencerSource Permite que la aplicación agregue o quite topologías.
IMFMediaSourceTopologyProvider Recupera la siguiente topología en cola en la sesión multimedia.
IMFMediaSourcePresentationProvider Usado por la sesión multimedia para finalizar segmentos. Las aplicaciones no usan esta interfaz.
IMFGetService Consulta el origen del secuenciador para las interfaces de servicio.

 

Para reproducir una secuencia de orígenes multimedia, realice los pasos siguientes:

  1. Para crear el origen del secuenciador, llame a la función MFCreateSequencerSource.
  2. Para cada segmento, cree una topología de reproducción, como se describe en Creación de topologías de reproducción. Para agregar la topología a la presentación, llame a IMFSequencerSource::AppendTopology.
  3. Antes de iniciar la reproducción, llame a IMFMediaSource::CreatePresentationDescriptor en el origen del secuenciador. Este método devuelve un puntero a un descriptor de presentación para el primer segmento. Para obtener la topología asociada a este segmento, llame a QueryInterface en el origen del secuenciador para la interfaz IMFMediaSourceTopologyProvider. Pase el descriptor de presentación al método IMFMediaSourceTopologyProvider::GetMediaSourceTopology. Este método devuelve un puntero a la topología.
  4. Pase la topología del primer segmento a la sesión multimedia mediante una llamada al método IMFMediaSession::SetTopology de la sesión multimedia.
  5. Inicie la reproducción llamando a IMFMediaSession::Start.
  6. Cuando el origen del secuenciador está listo para inscribir previamente el siguiente segmento, envía un evento MENewPresentation cuyos datos de evento son un puntero de interfaz IMFPresentationDescriptor. De nuevo, obtenga la topología del segmento llamando a GetMediaSourceTopologyen el origen del secuenciador y establezca la topología en la sesión multimedia llamando a SetTopology. No es necesario volver a iniciar el origen multimedia; se reproducirá automáticamente en el siguiente segmento.
  7. Antes de que se cierre la aplicación, apague el origen del secuenciador llamando a IMFMediaSource::Shutdown.

El código siguiente muestra cómo obtener la topología y establecerla en la sesión multimedia:

// Queues the next topology on the session.

HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
    IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
    IMFTopology *pTopology = NULL;

    //Get the topology for the presentation descriptor
    HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    //Set the topology on the media session
    m_pSession->SetTopology(NULL, pTopology);

done:
    SafeRelease(&pTopoProvider);
    SafeRelease(&pTopology);
    return hr;
}

Para obtener un ejemplo de código completo, vea Código de ejemplo de origen del secuenciador.

Adición de topologías

El origen del secuenciador mantiene dos listas de topologías: la lista de entrada y la lista de inscripción previa.

La lista de entrada es una colección de topologías correspondientes a segmentos de lista de reproducción, en el orden en que la aplicación agregó mediante una llamada a IMFSequencerSource::AppendTopology. Este método asigna a cada topología un identificador de segmento único del tipo MFSequencerElementId. El identificador de segmento se establece como atributo para todos los nodos de topología de origen. Una aplicación puede obtener el identificador de segmento de un nodo de origen mediante el atributo MF_TOPONODE_SEQUENCE_ELEMENTID. La lista de entrada puede tener topologías duplicadas si la aplicación llamó a AppendTopology en la misma topología más de una vez; sin embargo, se identifican mediante sus identificadores de segmento únicos.

La lista de inscripción previa es una colección de topologías de lista de entrada que se han inicializado como preparación para la reproducción. Esto permite a la sesión multimedia realizar la transición a la siguiente topología sin problemas cuando finaliza la topología activa. La aplicación no puede agregar ni quitar directamente topologías de la lista de inscripción previa; se genera mediante el origen del secuenciador cuando se selecciona una topología de la lista de entrada para la reproducción. Esto hace que el origen del secuenciador agregue la siguiente topología de la lista de entrada a la lista de inscripción previa. Después de hacerlo, el origen del secuenciador genera asincrónicamente el evento MENewPresentation y pasa el descriptor de presentación para la topología de inscripción previa como datos de eventos. La aplicación debe escuchar este evento mediante la interfaz IMFMediaEventGenerator de la sesión multimedia y poner en cola la topología de inscripción previa en la sesión multimedia llamando a IMFMediaSession::SetTopology . Esto debe hacerse antes de que la sesión multimedia complete la reproducción de la topología activa. SetTopology informa a la sesión multimedia sobre la siguiente topología que debe reproducirse una vez finalizada la reproducción de la topología activa. Para garantizar una transición sin problemas, la aplicación debe llamar a SetTopology antes de que la sesión multimedia finalice reproduciendo la topología anterior. De lo contrario, habrá una diferencia entre los segmentos.

El evento MENewPresentation se genera siempre que haya una topología después de la topología activa. Por lo tanto, si la lista de entrada contiene solo una topología, o si la topología activa es la última de la lista de entrada, este evento no se genera.

La lista de inscripción previa se sincroniza con la lista de entrada y se actualiza cada vez que se agrega o elimina una topología de la lista de entrada.

Eliminación de topologías

Para quitar una topología del origen del secuenciador, una aplicación debe llamar al método IMFSequencerSource::DeleteTopology y especificar el identificador de segmento.

Antes de llamar a DeleteTopology, la aplicación debe asegurarse de que la sesión multimedia no usa la topología que la aplicación quiere eliminar. Para ello, debe producirse lo siguiente antes de que la aplicación llame a DeleteTopology:

  • Evento MESessionTopologyStatus con MF_TOPOSTATUS_ENDED se recibe para la topología para asegurarse de que la sesión multimedia ha completado la reproducción.

  • MESessionTopologyStatus con MF_TOPOSTATUS_STARTED_SOURCE se recibe para la siguiente topología para asegurarse de que la sesión multimedia ha empezado a reproducir la siguiente topología, se recibe el evento MESessionEnded para asegurarse de que la sesión multimedia se realiza con la última topología en el origen del secuenciador.

Si el segmento que se va a eliminar es la topología activa, la reproducción se detiene y el origen del secuenciador genera el evento MEEndOfPresentationSegment. Si la topología activa también es la última topología, se genera el evento MEEndOfPresentation.

Omisión de un segmento

Una aplicación puede ir directamente a un segmento determinado de la secuencia iniciando la sesión multimedia con un desplazamiento de segmento, como se indica a continuación:

  1. Llame a la función MFCreateSequencerSegmentOffset para crear el desplazamiento del segmento. Especifique el identificador del segmento en el parámetro dwId. (El identificador lo devolvió el Método IMFSequencerSource::AppendTopology cuando agregó por primera vez la topología al origen del secuenciador). El parámetro hnsOffset especifica un desplazamiento de tiempo, en relación con el inicio del segmento. La reproducción se iniciará en este momento. Para el parámetro pvarSegmentOffset, pase la dirección de un PROPVARIANT vacío. Cuando la función devuelve, este PROPVARIANT contiene el desplazamiento del segmento.

  2. Llame al método IMFMediaSession::Start en la sesión multimedia. Para el parámetro pguidTimeFormat, use el valor GUID MF_TIME_FORMAT_SEGMENT_OFFSET. Este valor indica la búsqueda por desplazamiento de segmento. Para el parámetro pvarStartPosition, pase la dirección del PROPVARIANT creado en el paso anterior.

En el ejemplo de código siguiente se muestra cómo omitir el inicio de un segmento especificado en una secuencia.

// Skips to the specified segment in the sequencer source

HRESULT CPlaylist::SkipTo(DWORD index)
{
    if (index >= m_count)
    {
        return E_INVALIDARG;
    }

    MFSequencerElementId ID = m_segments[index].SegmentID;

    PROPVARIANT var;

    HRESULT hr = MFCreateSequencerSegmentOffset(ID, NULL, &var);
    
    if (SUCCEEDED(hr))
    {
        hr = m_pSession->Start(&MF_TIME_FORMAT_SEGMENT_OFFSET, &var);
        PropVariantClear(&var);
    }
    return hr;
}

Cuando la aplicación busca entre segmentos, la aplicación recibe varios eventos a medida que el origen del secuenciador finaliza el segmento actual y se prepara para reproducir el nuevo segmento. Dado que estos eventos se reciben de forma asincrónica, es difícil predecir la secuencia exacta de eventos. Estos eventos son los siguientes:

  • El origen del secuenciador envía un evento MENewPresentation para el nuevo segmento al que se omite la sesión multimedia.

  • Cuando el origen del secuenciador finaliza el segmento activo, envía el evento MEEndOfPresentationSegment.

  • A continuación, el origen del secuenciador cancela la topología de inscripción previa. Esto da como resultado los siguientes eventos para la topología cancelada:

  • A continuación, el origen del secuenciador envía eventos para el nuevo segmento, incluidos varios eventos MESessionTopologyStatus.

  • Si el nuevo segmento no es el último de la lista, el origen del secuenciador actualiza la lista de inscripción previa y genera otro MENewPresentation para la nueva topología de inscripción previa. Para obtener información sobre las topologías en la lista de inscripción previa, vea Acerca del origen del secuenciador.

Puede encontrar más detalles sobre los eventos enviados por el origen del secuenciador en el tema Eventos de origen del secuenciador.

Cómo crear una lista de reproducción

Origen del secuenciador