Меню

Iuvcr ошибка не удается запросить интерфейс iamstreamconfig

Я мог бы захватить изображение с веб-камеры и сохранить его как растровое изображение с помощью sampleGrabber. И я знаю, что мог бы использовать интерфейс IAMStreamConfig для GetFormat и SetFormat разрешения видео. Мой вопрос заключается в том, что я использую FindInterface (), чтобы получить IAMStreamConfig *, но всегда терпел неудачу. Это потому, что я поместил его в неправильное место или что-то еще, что я не заметил. Я поместил это перед RenderStream. Ниже приведен код, спасибо за терпение и помощь!

INT USBDeviceApp::GetInterfaces()
{
HRESULT hr;

hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &pGraphBuilder);
if (FAILED(hr))
return hr;

hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &pCaptureGraphBuilder2);
if (FAILED(hr))
return hr;

hr = pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)
&pMediaControl);
if (FAILED(hr))
return hr;hr = pGraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *)
&pVideoWindow);
if(FAILED(hr))
{
return hr;
}
hr = pGraphBuilder->QueryInterface(IID_IMediaEvent,(LPVOID *)
&pMediaEvent);
if(FAILED(hr))
{
return hr;
}
// ------------------------
// Create the Sample Grabber.
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void**)&pGrabberF);
if (FAILED(hr))
{
return hr;
}

hr = pGrabberF->QueryInterface(IID_ISampleGrabber,
(void**)&pSampleGrabber);
if(FAILED(hr))
{
AfxMessageBox(_T("Error SampleGrabber QueryInterface"));
}return 1;
}

INT USBDeviceApp::InitMonikers()
{
HRESULT hr;
ULONG cFetched;

ICreateDevEnum *pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
return hr;
}

IEnumMoniker *pEnumMoniker;

hr = pCreateDevEnum->
CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumMoniker, 0);
if (FAILED(hr) || !pEnumMoniker)
{
return -1;
}

hr = pEnumMoniker->Next(1, &pMonikerVideo, &cFetched);
if (S_OK == hr)
{
hr = pMonikerVideo->BindToObject(0,0,IID_IBaseFilter,
(void**)&pVideoCaptureFilter);
if (FAILED(hr))
{
return hr;
}
}
pEnumMoniker->Release();

return 1;
}

INT USBDeviceApp::CaptureVideo()
{
HRESULT hr = CoInitialize(NULL);

hr = GetInterfaces();
if (FAILED(hr))
{
AfxMessageBox(_T("Failed to get video interfaces!"));
return hr;
}

hr = pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);
if (FAILED(hr))
{
AfxMessageBox(_T("Failed to attach the filter graph to the capture graph!"));
return hr;
}
//IAMStreamConfig *pConfig
hr = pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pVideoCaptureFilter,IID_IAMStreamConfig, (void **)&pConfig);
if (FAILED(hr))
{
AfxMessageBox(_T("Couldn't initialize IAMStreamConfig!"));
}
else
{////
int iCount = 0,iSize = 0;
hr = pConfig->GetNumberOfCapabilities(&iCount,&iSize);
if(iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
{
for(int iFormat = 0;iFormat < iCount;iFormat++)
{
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmtConfig;
hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
if(hr)
{
if((pmtConfig->majortype == MEDIATYPE_Video) &&
(pmtConfig->subtype == MEDIASUBTYPE_RGB24) &&
(pmtConfig->formattype == FORMAT_VideoInfo) &&
(pmtConfig->cbFormat >= sizeof (VIDEOINFOHEADER)) &&
(pmtConfig->pbFormat != NULL))
{
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmtConfig->pbFormat;
pVih->bmiHeader.biWidth = 1280;
pVih->bmiHeader.biHeight = 720;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);
hr = pConfig->SetFormat(pmtConfi);
}

DeleteMediaType(pmtConfig);
}
}
}
}////

hr = InitMonikers();
if(FAILED(hr))
{
return hr;
}
hr = pGraphBuilder->AddFilter(pVideoCaptureFilter, L"Video Capture");
if (FAILED(hr))
{
pVideoCaptureFilter->Release();
return hr;
}

AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = pSampleGrabber->SetMediaType(&mt);

hr = pSampleGrabber->SetOneShot(FALSE);
hr = pSampleGrabber->SetBufferSamples(TRUE);

hr = pGraphBuilder->AddFilter(pGrabberF, L"Sample Grabber");
if (FAILED(hr))
{
return hr;
}

hr = pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pVideoCaptureFilter, pGrabberF, 0 );
if (FAILED(hr))
{
pVideoCaptureFilter->Release();
return hr;
}

hr = pSampleGrabber->GetConnectedMediaType( &mt );
if(FAILED( hr ))
{
return -1;
}
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;

pVih = (VIDEOINFOHEADER*) mt.pbFormat;

CSampleGrabberCB *CB  = new CSampleGrabberCB() ;

if(!FAILED( hr ))
{
CB->Width  = vih->bmiHeader.biWidth;
CB->Height = vih->bmiHeader.biHeight;
FreeMediaType( mt );
}
hr = pSampleGrabber->SetCallback( CB, 1 );

pVideoCaptureFilter->Release();

this->SetUpVideoWindow();
hr = pMediaControl->Run();
if (FAILED(hr))
{
return hr;
}

return hr;
}

hr = pCaptureGraphBuilder2-> FindInterface ()
мне всегда не удавалось получить интерфейс IAMStreamConfig, я действительно не знаю почему. Может кто-нибудь помочь мне, большое спасибо!

0

Решение

Ваш вызов API ниже

pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pVideoCaptureFilter,IID_IAMStreamConfig, (void **) &pConfig);

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

введите описание изображения здесь

Вы должны принять это во внимание и либо ослабить критерии поиска, либо я бы предпочел, чтобы вы разместили интересующий штифт непосредственно на фильтре захвата. Затем вы установите его и подключите к нисходящим одноранговым фильтрам. FindInterface является мощным, но это также добавляет шансов запутаться.

1

Другие решения

Других решений пока нет …

I’m trying to retrieve the IAMStreamConfig interface from the output pin on my Integrated Camera, but am failing to E_NOINTERFACE.

I’m using the IntCam as a testing device, in reality I will have a source filter with two output pins that each support different configurations.

This is why I’m not sure using ICaptureGraphBuilder2::FindInterface is an option, because I still haven’t figured out how I will be able to get the interface from a specific output pin.

CComPtr<IEnumPins> pEnum = NULL;
IPin* pPin = NULL;

HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
    return hr;

while (S_OK == pEnum->Next(1, &pPin, NULL))
{
   IAMStreamConfig* pAMStreamConfig;
   hr = pPin->QueryInterface(IID_PPV_ARGS(&pAMStreamConfig));
   if (FAILED(hr))
      return hr;
   // ...
}

asked Aug 22, 2012 at 12:06

Itsik's user avatar

3

IAMStreamConfig is not a mandatory interface, it might me missing, though on camera filters it is almost always available (many application would refuse working with a device without this interface otherwise). That is, you should double check that you are querying correct filter and pin, the code snippet looks good.

A real camera is most often implemented via WDM Video Capture Filter which has IAMStreamConfig but since you are using a virtual device, it might be different.

answered Aug 22, 2012 at 12:18

Roman R.'s user avatar

Roman R.Roman R.

67.5k6 gold badges93 silver badges155 bronze badges

4

I’m trying to retrieve the IAMStreamConfig interface from the output pin on my Integrated Camera, but am failing to E_NOINTERFACE.

I’m using the IntCam as a testing device, in reality I will have a source filter with two output pins that each support different configurations.

This is why I’m not sure using ICaptureGraphBuilder2::FindInterface is an option, because I still haven’t figured out how I will be able to get the interface from a specific output pin.

CComPtr<IEnumPins> pEnum = NULL;
IPin* pPin = NULL;

HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
    return hr;

while (S_OK == pEnum->Next(1, &pPin, NULL))
{
   IAMStreamConfig* pAMStreamConfig;
   hr = pPin->QueryInterface(IID_PPV_ARGS(&pAMStreamConfig));
   if (FAILED(hr))
      return hr;
   // ...
}

asked Aug 22, 2012 at 12:06

Itsik's user avatar

3

IAMStreamConfig is not a mandatory interface, it might me missing, though on camera filters it is almost always available (many application would refuse working with a device without this interface otherwise). That is, you should double check that you are querying correct filter and pin, the code snippet looks good.

A real camera is most often implemented via WDM Video Capture Filter which has IAMStreamConfig but since you are using a virtual device, it might be different.

answered Aug 22, 2012 at 12:18

Roman R.'s user avatar

Roman R.Roman R.

67.5k6 gold badges93 silver badges155 bronze badges

4

Сообщения без ответов | Активные темы

Автор Сообщение

Заголовок сообщения: DSB-C320;Error 80004002

СообщениеДобавлено: Вт апр 14, 2009 17:56 

Не в сети



Зарегистрирован: Вт апр 14, 2009 17:44
Сообщений: 1

Прошу помощи!

у меня проблема: подключаю камеру DSB-C320 и при загрузке AmCap система выдает такое сообщение: Error 80004002:cannot find Vcapture: IAMStreamConfig.

Камера соответственно не работает.

Подключаю камеру к другому компу все прекрасно работает, никаких ошибок не выдает.

Подскажите пожалуйста, в чем может быть проблема?

Вернуться наверх

Профиль  

Nikita Schekotov

Заголовок сообщения: Re: DSB-C320;Error 80004002

СообщениеДобавлено: Чт апр 16, 2009 15:32 



Зарегистрирован: Ср мар 12, 2008 20:34
Сообщений: 1105
Откуда: Москва

Alex_Merk писал(а):

Прошу помощи!
у меня проблема: подключаю камеру DSB-C320 и при загрузке AmCap система выдает такое сообщение: Error 80004002:cannot find Vcapture: IAMStreamConfig.
Камера соответственно не работает.
Подключаю камеру к другому компу все прекрасно работает, никаких ошибок не выдает.
Подскажите пожалуйста, в чем может быть проблема?

Какая ОС?

Какой драйвер?

Как устанавливали драйвер?

Вернуться наверх

Профиль  

женечка

Заголовок сообщения: Помоги!!!!!!!!!!!!!!!!!

СообщениеДобавлено: Вс май 31, 2009 21:55 

Не в сети



Зарегистрирован: Вс май 31, 2009 21:39
Сообщений: 1

Вот-вот-вот!!!!!!!!!!! Такая же проблема!!!!!! Подключаю как положено. С родным диском, идущим в комплекте. Не работает и все тут. Уже не раз пробовала удалять все драйвера, чистить реестр и по новой ставить. Ничего. Носила в сервисный центр, у них все заработало! Значит видимо дело в моем компе??? Подскажите пожалуйста! Я уже отчаилась самостоятельно ее настроить! :cry:

Вернуться наверх

Профиль  

Nikita Schekotov

Заголовок сообщения: Re: Помоги!!!!!!!!!!!!!!!!!

СообщениеДобавлено: Ср июн 03, 2009 11:30 



Зарегистрирован: Ср мар 12, 2008 20:34
Сообщений: 1105
Откуда: Москва

женечка писал(а):

Вот-вот-вот!!!!!!!!!!! Такая же проблема!!!!!! Подключаю как положено. С родным диском, идущим в комплекте. Не работает и все тут. Уже не раз пробовала удалять все драйвера, чистить реестр и по новой ставить. Ничего. Носила в сервисный центр, у них все заработало! Значит видимо дело в моем компе??? Подскажите пожалуйста! Я уже отчаилась самостоятельно ее настроить! :cry:

Попробуйте установить используя последнюю версию драйвера (в зависимости от аппаратной версии камеры (H/W, указана на стикере рядом с серийным номером)) с нашего FTP-сервера:

http://ftp.dlink.ru/pub/Multimedia/DSB-C320/Drivers/

Вернуться наверх

Профиль  

Anjeyka

Заголовок сообщения:

СообщениеДобавлено: Ср сен 30, 2009 20:35 

Не в сети



Зарегистрирован: Вс сен 14, 2008 22:33
Сообщений: 3

Вернуться наверх

Профиль  

TOMMM

Заголовок сообщения: Re: DSB-C320;Error 80004002

СообщениеДобавлено: Пн фев 01, 2010 22:31 

Не в сети



Зарегистрирован: Пн фев 01, 2010 22:26
Сообщений: 2

Alex_Merk писал(а):

Прошу помощи!
у меня проблема: подключаю камеру DSB-C320 и при загрузке AmCap система выдает такое сообщение: Error 80004002:cannot find Vcapture: IAMStreamConfig.
Камера соответственно не работает.
Подключаю камеру к другому компу все прекрасно работает, никаких ошибок не выдает.
Подскажите пожалуйста, в чем может быть проблема?

подскажи как решить данную проблему ….

Вернуться наверх

Профиль  

Anjeyka

Заголовок сообщения:

СообщениеДобавлено: Ср фев 03, 2010 14:29 

Не в сети



Зарегистрирован: Вс сен 14, 2008 22:33
Сообщений: 3

Вернуться наверх

Профиль  

TOMMM

Заголовок сообщения:

СообщениеДобавлено: Ср фев 03, 2010 14:56 

Не в сети



Зарегистрирован: Пн фев 01, 2010 22:26
Сообщений: 2

Anjeyka писал(а):

попробуй этот драйвер
у меня заработало

http://files.mail.ru/SHLAN6

линк активен до 8.02.2010

думаю мож админы очнутся.. послушаю их

Вернуться наверх

Профиль  

Anjeyka

Заголовок сообщения:

СообщениеДобавлено: Ср фев 03, 2010 15:08 

Не в сети



Зарегистрирован: Вс сен 14, 2008 22:33
Сообщений: 3

TOMMM писал(а):

думаю мож админы очнутся.. послушаю их

я не дождался …

юзай родной драйвер с диска или ищи по коду устройства в «диспечере устройств»

удачи

Вернуться наверх

Профиль  

Nikita Schekotov

Заголовок сообщения: Re: DSB-C320;Error 80004002

СообщениеДобавлено: Ср фев 10, 2010 17:49 



Зарегистрирован: Ср мар 12, 2008 20:34
Сообщений: 1105
Откуда: Москва

TOMMM писал(а):

подскажи как решить данную проблему ….

Пришлите скриншоты установки и ошибки на почту

Вернуться наверх

Профиль  

MiKxA

Заголовок сообщения:

СообщениеДобавлено: Ср мар 10, 2010 05:38 

Не в сети



Зарегистрирован: Ср мар 10, 2010 05:09
Сообщений: 1
Откуда: Владивосток

Впервый раз камера установилась и заработала, но через какое-то время из-за работы другой программы компьтер показал «синий экран» и перезагрузился. После этого камера оказалась не установленной. повторная установка — uninstall — установка сопровождалась ошибкой при установке (Filed to setup driver:5) и требованием найти какие-то файлы dll. Эти файлы я нашел поиском в системных папках и указал по требованию программы их местонахождение. После чего было сообщение, что на компьютер камера установлена. Но при попытке включить камеру в «Мой компьютер» выходит сообщение «Сбой предварительного просмотра видео» с содержанием «Не удалось создать предварительный просмотр видео. Убедитесь, что это устройство подключено, и что просмотр видеосигнала с этого устройства не выполняется другом приложении.» А при запуске самой программы AMCap «ошибка Error 80004002: Cannot find VCapture:IAMStreamConfig»

Теперь при при действии: uninstall — перезагрузка — установка, программа не требует поиска dll файлов, но ошибки те же.[/img]

Вернуться наверх

Профиль  

Nikita Schekotov

Заголовок сообщения:

СообщениеДобавлено: Чт мар 11, 2010 18:06 



Зарегистрирован: Ср мар 12, 2008 20:34
Сообщений: 1105
Откуда: Москва

Вернуться наверх

Профиль  

Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 4

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

  • Remove From My Forums
  • Вопрос

  • Hi,

    I am trying to get an instance of IAMStreamConfig using the ICaptureGraphBuilder2::FindInterface

    But the problem is that it is not consistent.

    Sometimes it works in first attempt, but most of the times it fails(with E_NOINTERFACE) in first attempt but will work fine in 2nd or third attempt.

    Has anyone faced such problem?

    Thanks

Ответы

  • Check graph topologies you have in different cases. Typically you don’t need to look for this interface using graph manager/builder, but instead just locate it on capture filter.


    http://alax.info/blog/tag/directshow

    • Помечено в качестве ответа

      14 января 2010 г. 17:52

Я пытаюсь получить IAMStreamConfig интерфейс от выходного контакта на моей встроенной камере, но я не могу E_NOINTERFACE.

Я использую IntCam в качестве тестового устройства, на самом деле у меня будет исходный фильтр с двумя выходными контактами, каждый из которых поддерживает разные конфигурации.

Вот почему я не уверен, что использую ICaptureGraphBuilder2::FindInterface это вариант, потому что я до сих пор не понял, как я смогу получить интерфейс с определенного выходного контакта.

CComPtr<IEnumPins> pEnum = NULL;
IPin* pPin = NULL;

HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
    return hr;

while (S_OK == pEnum->Next(1, &pPin, NULL))
{
   IAMStreamConfig* pAMStreamConfig;
   hr = pPin->QueryInterface(IID_PPV_ARGS(&pAMStreamConfig));
   if (FAILED(hr))
      return hr;
   // ...
}

1 ответы

IAMStreamConfig не является обязательным интерфейсом, его может не быть, хотя на фильтрах камеры он почти всегда доступен (в противном случае многие приложения отказались бы работать с устройством без этого интерфейса). То есть вы должны дважды проверить, что вы запрашиваете правильный фильтр и пин, фрагмент кода выглядит хорошо.

Настоящая камера чаще всего реализуется через WDM Video Capture Filter который имеет IAMStreamConfig но поскольку вы используете виртуальное устройство, оно может быть другим.

ответ дан 22 авг.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c++
directshow

or задайте свой вопрос.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Itw a 5851 w коды ошибок
  • Ituneshelper exe системная ошибка