Partilhar via


Criando nós de saída

Um nó de saída representa um coletor de fluxo em um coletor de mídia. Há duas maneiras de inicializar um nó de saída:

  • De um ponteiro para o coletor de fluxo.
  • De um ponteiro para um objeto de ativação para o coletor de mídia.

Se você pretende carregar a topologia dentro do PMP (caminho de mídia protegido), deverá usar um objeto de ativação para que o coletor de mídia possa ser criado dentro do processo protegido. A primeira abordagem (usando um ponteiro para o coletor de fluxo) não funciona com o PMP.

Criando um nó de saída de um coletor de fluxo

Para criar um nó de saída de um coletor de fluxo, faça o seguinte:

  1. Crie uma instância do coletor de mídia.
  2. Use a interface IMFMediaSink do coletor de mídia para obter um ponteiro para o coletor de fluxo desejado. (A interface IMFMediaSink tem vários métodos que retornam ponteiros para um coletor de fluxo.)
  3. Chame MFCreateTopologyNode com o sinalizador MF_TOPOLOGY_OUTPUT_NODE para criar o nó de saída.
  4. Chame IMFTopologyNode::SetObject e passe um ponteiro para a interface IMFStreamSink do coletor de fluxo.
  5. Defina o atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVE como FALSE (opcional, mas recomendado).
  6. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de saída de um coletor de fluxo.

HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFStreamSink *pStreamSink, // Stream sink.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    IMFTopologyNode *pNode = NULL;
    HRESULT hr = S_OK;
    
    // Create the node.
    hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);

    // Set the object pointer.
    if (SUCCEEDED(hr))
    {
        hr = pNode->SetObject(pStreamSink);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    if (SUCCEEDED(hr))
    {
        hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, TRUE);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    if (pNode)
    {
        pNode->Release();
    }
    return hr;
}

Quando o aplicativo desliga a Sessão de Mídia, a Sessão de Mídia desliga automaticamente o coletor de mídia. Portanto, você não pode reutilização do coletor de mídia com outra instância da Sessão de Mídia.

Criando um nó de saída de um objeto de ativação

Qualquer coletor de mídia confiável deve fornecer um objeto de ativação, para que o coletor de mídia possa ser criado dentro do processo protegido. Para obter mais informações, consulte Objetos de ativação. A função específica que cria o objeto de ativação dependerá do coletor de mídia.

Para criar um nó de saída de um objeto de ativação, faça o seguinte:

  1. Crie o objeto de ativação e obtenha um ponteiro para a interface IMFActivate do objeto de ativação.
  2. Chame MFCreateTopologyNode com o sinalizador MF_TOPOLOGY_OUTPUT_NODE para criar o nó de saída.
  3. Opcionalmente, defina o atributo MF_TOPONODE_STREAMID no nó para especificar o identificador de fluxo do coletor de fluxo. Se você omitir esse atributo, o nó usará o coletor de fluxo 0 como padrão.
  4. Defina o atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVE como TRUE (opcional, mas recomendado).
  5. Chame IMFTopologyNode::SetObject e passe o ponteiro IMFActivate .
  6. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de saída de um objeto de ativação.

// Add an output node to a topology.
HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFActivate *pActivate,     // Media sink activation object.
    DWORD dwId,                 // Identifier of the stream sink.
    IMFTopologyNode **ppNode)   // Receives the node pointer.
{
    IMFTopologyNode *pNode = NULL;

    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the object pointer.
    hr = pNode->SetObject(pActivate);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the stream sink ID attribute.
    hr = pNode->SetUINT32(MF_TOPONODE_STREAMID, dwId);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Add the node to the topology.
    hr = pTopology->AddNode(pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppNode = pNode;
    (*ppNode)->AddRef();

done:
    SafeRelease(&pNode);
    return hr;
}

IMFTopologyNode

Criando topologias

Coletores de mídia

Topologias