2015-06-04 6 views
0

У меня есть проект, в котором исходное устройство имеет SVideo и композитный разъем для захвата. В DirectShow я могу использовать IAMCrossbar для установки того, на какой из них следует снимать, но в MediaFoundation я получаю только один видеопоток и статус C00D3704 при попытке начать потоковое вещание (используя SourceReader). Есть ли способ выбрать вход в MediaFoundation?MediaFoundation с устройством с несколькими входами?

NB: LEADTOOLS утверждает, что может это сделать, но я не знаю, как это сделать. Ничто другое, что я нашел, говорит, как это сделать.

Указатели на правильный интерфейс и/или атрибутов будет достаточно ...

ответ

1

Ответ зависит от конкретной карты захвата, но все же довольно просто. Некоторые карты захвата (например, карта с двумя головками Datapath) отображаются как два отдельных устройства (для каждой карты в системе). Таким образом, вы будете активировать их по отдельности, после перечисления (проверки ошибок опущены для краткости):

UINT32 deviceCount = 0; 
IMFActivate** devices = nullptr; 
Microsoft::WRL::ComPtr<IMFAttributes> attributes = nullptr; 
hr = ::MFCreateAttributes(attributes.GetAddressOf(), 1); 
hr = ::attributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
          MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); 
hr = ::MFEnumDeviceSources(attributes.Get(), &devices, &deviceCount); 

А затем активацией устройства с помощью GetMediaFoundationActivator и функции члена ActivateObject.

Это имеет смысл для карты, такой как упомянутая выше, поскольку на каждом входе имеется отдельное оборудование на карте. И вы можете одновременно активировать каждый в результате.

Однако драйвер может сообщать о вашем SVideo и Composite в качестве одного устройства, так как он, вероятно, будет использовать одно и то же оборудование. В этом случае вы найдете отдельные типы потоков на одном IMFSourceReader.

IMFMediaType* mediaType = nullptr; 

HRESULT hr = S_OK; 
while (hr == S_OK) 
{ 
    hr = reader->GetNativeMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, index, &mediaType); 
    if (hr == MF_E_NO_MORE_TYPES) 
     break; 

    // ... [ process media type ] 
    ++index; 
} 

В этом случае вы установите выбор потока (IMFSourceReader::SetStreamSelection). Я подробно расскажу об этой теме here.

Если вы намерены одновременно записывать аудио, вам придется построить агрегатный источник, который я написал немного о here;

Предполагая, что у вашей карты захвата есть достаточно свежие драйверы, я уверен, что вы сможете найти и прочитать из ваших доступных потоков без особых проблем. Удачи.

+0

Drat! Я надеялся, что это то, чего я пропустил, но ваш (очень хороший и подробный) ответ говорит мне, что у меня была правильная идея. Устройства, о которых идет речь, являются Hauppauge USB-Live2 и Startech.com SVID2USB2NS. Учитывая, что оба представляют один видеопоток на одном устройстве, я, вероятно, SOL на них. – ioctlLR

Смежные вопросы