Какие пользовательские вводы требуются для выбора устройства цифрового телевидения?
В процессе построения графика цифрового телевидения мне нужно:
Network Provider -> Tuner -> Capture -> MPEG2-Demux -> MPEG2 TIF
-> MPEG2 Sections
-> Video Decoder -> VMR9
-> Audio Decoder -> DirectSound
Для меня очевидно, что я могу жестко кодировать от имени провайдера (Microsoft Network Provider
), но нужно ли мне предлагать пользователю выбрать тюнер и устройство захвата из списка доступных устройств, или я могу как-то запросить тюнер, который соответствует устройству захвата, которое выбрал пользователь?
В основном я спрашиваю, существует ли вызов API, подобный следующему:
IMoniker *pTuner = GetTunerForCaptureDevice(pIMonikerSelectedCaptureDevice);
или является ли стандартным, чтобы пользователь выбирал и тюнер, и устройства захвата в их конфигурации.
1 ответ
Кажется, что большинство приложений решают эту проблему - это идти в обратном направлении. В целях конфигурации они предоставляют список всех устройств в категории KSCATEGORY_BDA_NETWORK_TUNER
и позволить пользователю выбрать один из тюнеров.
После того, как это устройство было добавлено в граф, все устройства перечислены в категории KSCATEGORY_BDA_RECEIVER_COMPONENT
, Для каждого возвращенного элемента элемент устройства захвата добавляется к графику, и вызывается соединение между выходным контактом тюнера и входным контактом захвата. Грубый код: (без необходимого Releases()
"S)
for (fFound=FALSE; !fFound; )
{
IMoniker *pIMoniker;
IBaseFilter *ppIBaseFilter;
hr = pIEnumMoniker->Next(1, &pIMoniker, NULL);
if (hr!=S_OK)
break;
hr = pIMoniker->BindToObject(NULL, NULL, __uuidof(IBaseFilter),
(void **)&ppIBaseFilter);
hr = m_pIGraphBuilder->AddFilter(*ppIBaseFilter, L"Capture filter");
hr = ConnectFilters(m_pIGraphBuilder, pITunerFilter, ppIBaseFilter)));
if (hr != S_OK)
{
m_pIGraphBuilder->RemoveFilter(ppIBaseFilter);
goto NextMoniker;
}
fFound = TRUE;
NextMoniker:
// release things here.
}
Если какое-либо из устройств захвата успешно соединяет контакты, тогда цикл заканчивается, и этот фильтр захвата используется на графике.
Я пошел в этом направлении, начав с выбора пользователем тюнера, потому что я видел несколько продуктов, которые возвращали более одного устройства тюнера, и при попытке соединения в обратном порядке (захват, затем тюнер) я, казалось, всегда успешно подключал неправильный тюнер.