建立輸出節點
輸出節點代表媒體接收上的資料流程接收。 有兩種方式可以初始化輸出節點:
- 從資料流程接收的指標。
- 從媒體接收之啟用物件的指標。
如果您要在受保護的媒體路徑內載入拓撲, (PMP) ,您必須使用啟用物件,以便在受保護的進程內建立媒體接收。 第一種方法 (使用資料流程接收指標) 不適用於 PMP。
從資料流程接收建立輸出節點
若要從資料流程接收建立輸出節點,請執行下列動作:
- 建立媒體接收的實例。
- 使用媒體接收的 IMFMediaSink 介面來取得所需資料流程接收的指標。 (IMFMediaSink 介面有數種方法可傳回資料流程接收的指標。)
- 使用MF_TOPOLOGY_OUTPUT_NODE旗標呼叫MFCreateTopologyNode,以建立輸出節點。
- 呼叫 IMFTopologyNode::SetObject ,並傳入資料流程接收之 IMFStreamSink 介面的指標。
- 將 MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 屬性設定為 FALSE (選擇性但建議) 。
- 呼叫 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;
}
當應用程式關閉媒體會話時,媒體會話會自動關閉媒體接收。 因此,您無法將媒體接收與媒體會話的另一個實例重複使用。
從啟用物件建立輸出節點
任何信任的媒體接收都必須提供啟用物件,以便在受保護的進程內建立媒體接收。 如需詳細資訊,請參閱 啟用物件。 建立啟用物件的特定函式將取決於媒體接收。
若要從啟用物件建立輸出節點,請執行下列動作:
- 建立啟用物件,並取得啟用物件的 IMFActivate 介面指標。
- 使用MF_TOPOLOGY_OUTPUT_NODE旗標呼叫MFCreateTopologyNode,以建立輸出節點。
- 您可以選擇性地在節點上設定 MF_TOPONODE_STREAMID 屬性,以指定資料流程接收的資料流程識別碼。 如果您省略這個屬性,節點預設會使用資料流程接收 0。
- 將 MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 屬性設定為 TRUE (選擇性但建議) 。
- 呼叫 IMFTopologyNode::SetObject 並傳入 IMFActivate 指標。
- 呼叫 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;
}
相關主題