使用交叉欄
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
如果視訊擷取卡有一個以上的實體輸入,或支援一個以上的硬體路徑來取得資料,則篩選圖表可能包含 類比視訊交叉條篩選條件。 擷取圖形產生器會在需要時自動新增此篩選;它會從擷取篩選器上游。 根據硬體而定,篩選圖表可能包含一個以上的交叉欄篩選實例。
交叉欄篩選會公開 IAMCrossbar 介面,您可以使用此介面將特定輸入路由傳送至特定輸出。 例如,視訊卡可能有同軸連接器和 S-Video 輸入。 這些會以交叉欄篩選上的輸入針腳表示。 若要選取輸入,請使用 IAMCrossbar::Route 方法,將對應的輸入釘選路由至交叉列的輸出釘選。
若要在圖表中尋找交叉欄篩選,您可以使用 ICaptureGraphBuilder2::FindInterface 方法來搜尋支援 IAMCrossbar 的篩選準則。 例如,下列程式碼會搜尋兩個交叉列:
// Search upstream for a crossbar.
IAMCrossbar *pXBar1 = NULL;
hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pSrc,
IID_IAMCrossbar, (void**)&pXBar1);
if (SUCCEEDED(hr))
{
// Found one crossbar. Get its IBaseFilter interface.
IBaseFilter *pFilter = NULL;
hr = pXBar1->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
if (SUCCEEDED(hr))
{
// Search upstream for another crossbar.
IAMCrossbar *pXBar2 = NULL;
hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pFilter,
IID_IAMCrossbar, (void**)&pXBar2);
pFilter->Release();
if (SUCCEEDED(hr))
{
/* ... */
pXBar2->Release();
}
}
pXBar1->Release();
}
如需更一般化的方法,請參閱 AmCap 範例中的 CCrossbar 類別。
當您有 IAMCrossbar 介面的指標之後,您可以取得交叉線篩選的相關資訊,包括每個針腳的實體類型,以及可路由傳送至哪些輸出針腳的矩陣。
若要判斷針腳對應的實體連接器類型,請呼叫 IAMCrossbar::get_CrossbarPinInfo 方法。 方法會傳回 PhysicalConnectorType 列舉的成員。 例如,S-Video 針腳會傳回值PhysConn_Video_SVideo。
get_CrossbarInfo方法也會指出兩個針腳是否彼此相關。 例如,視訊微調器釘選可能與音訊微調器釘選相關。 相關的針腳方向相同,而且通常是卡片上相同實體插接器或連接器的一部分。
若要判斷您是否可以將輸入釘選路由傳送至特定輸出針腳,請呼叫 IAMCrossbar::CanRoute 方法。
若要判斷針腳之間的目前路由,請呼叫 IAMCrossbar::get_IsRoutedTo 方法。
先前的方法會依索引編號指定針腳,輸出針腳和輸入針腳都是從零編制索引。 呼叫 IAMCrossbar::get_PinCounts 方法來尋找篩選上的針腳數目。
例如,下列程式碼會顯示主控台視窗交叉欄篩選的相關資訊:
// Helper function to associate a name with the type.
const char * GetPhysicalPinName(long lType)
{
switch (lType)
{
case PhysConn_Video_Tuner: return "Video Tuner";
case PhysConn_Video_Composite: return "Video Composite";
case PhysConn_Video_SVideo: return "S-Video";
case PhysConn_Video_RGB: return "Video RGB";
case PhysConn_Video_YRYBY: return "Video YRYBY";
case PhysConn_Video_SerialDigital: return "Video Serial Digital";
case PhysConn_Video_ParallelDigital: return "Video Parallel Digital";
case PhysConn_Video_SCSI: return "Video SCSI";
case PhysConn_Video_AUX: return "Video AUX";
case PhysConn_Video_1394: return "Video 1394";
case PhysConn_Video_USB: return "Video USB";
case PhysConn_Video_VideoDecoder: return "Video Decoder";
case PhysConn_Video_VideoEncoder: return "Video Encoder";
case PhysConn_Audio_Tuner: return "Audio Tuner";
case PhysConn_Audio_Line: return "Audio Line";
case PhysConn_Audio_Mic: return "Audio Microphone";
case PhysConn_Audio_AESDigital: return "Audio AES/EBU Digital";
case PhysConn_Audio_SPDIFDigital: return "Audio S/PDIF";
case PhysConn_Audio_SCSI: return "Audio SCSI";
case PhysConn_Audio_AUX: return "Audio AUX";
case PhysConn_Audio_1394: return "Audio 1394";
case PhysConn_Audio_USB: return "Audio USB";
case PhysConn_Audio_AudioDecoder: return "Audio Decoder";
default: return "Unknown Type";
}
}
void DisplayCrossbarInfo(IAMCrossbar *pXBar)
{
HRESULT hr;
long cOutput = -1, cInput = -1;
hr = pXBar->get_PinCounts(&cOutput, &cInput);
for (long i = 0; i < cOutput; i++)
{
long lRelated = -1, lType = -1, lRouted = -1;
hr = pXBar->get_CrossbarPinInfo(FALSE, i, &lRelated, &lType);
hr = pXBar->get_IsRouted(i, &lRouted);
printf("Output pin %d: %s\n", i, GetPhysicalPinName(lType));
printf("\tRelated out: %d, Routed in: %d\n", lRelated, lRouted);
printf("\tSwitching Matrix: ");
for (long j = 0; j < cInput; j++)
{
hr = pXBar->CanRoute(i, j);
printf("%d-%s", j, (S_OK == hr ? "Yes" : "No"));
}
printf("\n\n");
}
for (i = 0; i < cInput; i++)
{
long lRelated = -1, lType = -1;
hr = pXBar->get_CrossbarPinInfo(TRUE, i, &lRelated, &lType);
printf("Input pin %d - %s\n", i, GetPhysicalPinName(lType));
printf("\tRelated in: %d\n", lRelated);
}
}
針對假設的卡片,此函式可能會產生下列輸出:
Output pin 0: S-Video
Related out: 2, Routed in: 0
Switching Matrix: 0-Yes 1-No 2-No 3-No
Output pin 1 - Video Tuner
Related out: 2, Routed in: 1
Switching Matrix: 0-No 1-Yes 2-No 3-No
Output pin 2 - Audio decoder
Related out: 1, Routed in: -1
Switching Matrix: 0-No 1-No 2-Yes 3-Yes
Input pin 0 - S-Video
Related in: 2
Input pin 1 - Video Tuner
Related in: 3
Input pin 2 - Audio line
Related in: 0
Input pin 3 - Audio tuner
Related in: 1
在輸出端,S-Video 和視訊微調器都與音訊解碼器相關。 在輸入端,視訊微調器與音訊微調器相關,而 S-Video 與中的音訊線相關。 S-Video 輸入會路由傳送至 S-Video 輸出;和視訊微調器輸入會路由傳送至視訊微調器輸出。 目前不會將任何內容路由傳送至音訊解碼器,但 中的音訊線或音訊微調器都可以路由傳送到其中。
您可以呼叫 IAMCrossbar::Route 方法來變更現有的路由。