Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Jeśli karta przechwytywania wideo ma więcej niż jedno fizyczne wejście lub obsługuje więcej niż jedną ścieżkę sprzętową danych, graf filtra może zawierać Analog Video Crossbar Filter. Konstruktor grafu przechwytywania automatycznie dodaje ten filtr w razie potrzeby; będzie on umiejscowiony przed filtrem przechwytywania. W zależności od sprzętu wykres filtru może zawierać więcej niż jedno wystąpienie filtru krzyżowego.
Filtr przełącznika krzyżowego uwidacznia interfejs IAMCrossbar, którego można użyć do kierowania określonego wejścia do określonego wyjścia. Na przykład karta wideo może mieć łącznik koncentryczny i wejście S-Video. Będą one reprezentowane jako wyprowadzenia wejściowe filtru paska krzyżowego. Aby wybrać wejście, należy skierować odpowiedni pin wejściowy do pinu wyjściowego przełącznicy, używając metody IAMCrossbar::Route.
Aby zlokalizować filtry krzyżowe na grafie, możesz użyć metody ICaptureGraphBuilder2::FindInterface, aby wyszukać filtry obsługujące IAMCrossbar. Na przykład następujący kod wyszukuje dwie belki:
// 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();
}
Aby uzyskać bardziej uogólnione podejście, zobacz klasę CCrossbar w przykładzie AmCap.
Po uzyskaniu wskaźnika do interfejsu IAMCrossbar można uzyskać informacje o przełączniku krzyżowym, w tym fizycznym typie każdego pinu oraz macierzy, które piny wejściowe można połączyć z którymi pinami wyjściowymi.
Aby określić typ fizycznego złącza, do którego należy pin, wywołaj metodę IAMCrossbar::get_CrossbarPinInfo. Metoda zwraca element członkowski PhysicalConnectorType wyliczenia. Na przykład pin/styk S-Video zwraca wartość PhysConn_Video_SVideo.
Metoda get_CrossbarInfo wskazuje również, czy dwa piny są powiązane. Na przykład pin tunera wideo może być związany z numerem PIN tunera audio. Powiązane wyprowadzenia mają ten sam kierunek wyprowadzenia i są zwykle częścią tego samego fizycznego gniazda lub łącznika na karcie.
Aby określić, czy można przekierować pin wejściowy do określonego pinu wyjściowego, wywołaj metodę IAMCrossbar::CanRoute.
Aby określić bieżący routing między wyprowadzeniami, wywołaj metodę IAMCrossbar::get_IsRoutedTo.
Poprzednie metody określają piny po numerze indeksu, przy czym piny wyjściowe i wejściowe są numerowane od zera. Wywołaj metodę IAMCrossbar::get_PinCounts, aby określić liczbę pinów na filtrze.
Na przykład poniższy kod wyświetla informacje o filtrze krzyżowym w oknie konsoli:
// 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);
}
}
W przypadku hipotetycznej karty ta funkcja może wygenerować następujące dane wyjściowe:
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
Po stronie wyjściowej S-Video i tuner wideo są powiązane z dekoderem audio. Po stronie wejściowej tuner wideo jest złączony z tunerem audio, a S-Video jest złączone z wejściem liniowym audio. Wejście S-Video jest kierowane do wyjścia S-Video; a wejście tunera wideo jest kierowane do wyjścia tunera wideo. Obecnie nic nie jest kierowane do dekodera audio, ale zarówno wejście audio, jak i tuner audio mogą być kierowane do niego.
Istniejący routing można zmienić, wywołując metodę IAMCrossbar::Route.