Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие 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();
}
Более обобщенный подход см. в классе CCrossbar в AmCap Sample.
После получения указателя на интерфейс 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.