建立輸出節點

輸出節點代表媒體接收上的資料流程接收。 有兩種方式可以初始化輸出節點:

  • 從資料流程接收的指標。
  • 從媒體接收之啟用物件的指標。

如果您要在受保護的媒體路徑內載入拓撲, (PMP) ,您必須使用啟用物件,以便在受保護的進程內建立媒體接收。 第一種方法 (使用資料流程接收指標) 不適用於 PMP。

從資料流程接收建立輸出節點

若要從資料流程接收建立輸出節點,請執行下列動作:

  1. 建立媒體接收的實例。
  2. 使用媒體接收的 IMFMediaSink 介面來取得所需資料流程接收的指標。 (IMFMediaSink 介面有數種方法可傳回資料流程接收的指標。)
  3. 使用MF_TOPOLOGY_OUTPUT_NODE旗標呼叫MFCreateTopologyNode,以建立輸出節點。
  4. 呼叫 IMFTopologyNode::SetObject ,並傳入資料流程接收之 IMFStreamSink 介面的指標。
  5. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 屬性設定為 FALSE (選擇性但建議) 。
  6. 呼叫 IMFTopology::AddNode ,將節點新增至拓撲。

下列範例會從資料流程接收建立和初始化輸出節點。

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;
}

當應用程式關閉媒體會話時,媒體會話會自動關閉媒體接收。 因此,您無法將媒體接收與媒體會話的另一個實例重複使用。

從啟用物件建立輸出節點

任何信任的媒體接收都必須提供啟用物件,以便在受保護的進程內建立媒體接收。 如需詳細資訊,請參閱 啟用物件。 建立啟用物件的特定函式將取決於媒體接收。

若要從啟用物件建立輸出節點,請執行下列動作:

  1. 建立啟用物件,並取得啟用物件的 IMFActivate 介面指標。
  2. 使用MF_TOPOLOGY_OUTPUT_NODE旗標呼叫MFCreateTopologyNode,以建立輸出節點。
  3. 您可以選擇性地在節點上設定 MF_TOPONODE_STREAMID 屬性,以指定資料流程接收的資料流程識別碼。 如果您省略這個屬性,節點預設會使用資料流程接收 0。
  4. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 屬性設定為 TRUE (選擇性但建議) 。
  5. 呼叫 IMFTopologyNode::SetObject 並傳入 IMFActivate 指標。
  6. 呼叫 IMFTopology::AddNode ,將節點新增至拓撲。

下列範例會從啟用物件建立和初始化輸出節點。

// 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

建立拓撲

媒體接收

拓撲