Я мог бы захватить изображение с веб-камеры и сохранить его как растровое изображение с помощью 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
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.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
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.Roman R.
67.5k6 gold badges93 silver badges155 bronze badges
4
Сообщения без ответов | Активные темы
| Автор | Сообщение |
|---|---|
|
Заголовок сообщения: DSB-C320;Error 80004002
|
|
|
|
Прошу помощи! |
| Вернуться наверх |
|
|
Nikita Schekotov |
Заголовок сообщения: Re: DSB-C320;Error 80004002
|
|
|
Alex_Merk писал(а): Прошу помощи!
Какая ОС? |
| Вернуться наверх |
|
|
женечка |
Заголовок сообщения: Помоги!!!!!!!!!!!!!!!!!
|
|
|
Вот-вот-вот!!!!!!!!!!! Такая же проблема!!!!!! Подключаю как положено. С родным диском, идущим в комплекте. Не работает и все тут. Уже не раз пробовала удалять все драйвера, чистить реестр и по новой ставить. Ничего. Носила в сервисный центр, у них все заработало! Значит видимо дело в моем компе??? Подскажите пожалуйста! Я уже отчаилась самостоятельно ее настроить! |
| Вернуться наверх |
|
|
Nikita Schekotov |
Заголовок сообщения: Re: Помоги!!!!!!!!!!!!!!!!!
|
|
|
женечка писал(а): Вот-вот-вот!!!!!!!!!!! Такая же проблема!!!!!! Подключаю как положено. С родным диском, идущим в комплекте. Не работает и все тут. Уже не раз пробовала удалять все драйвера, чистить реестр и по новой ставить. Ничего. Носила в сервисный центр, у них все заработало! Значит видимо дело в моем компе??? Подскажите пожалуйста! Я уже отчаилась самостоятельно ее настроить! Попробуйте установить используя последнюю версию драйвера (в зависимости от аппаратной версии камеры (H/W, указана на стикере рядом с серийным номером)) с нашего FTP-сервера: http://ftp.dlink.ru/pub/Multimedia/DSB-C320/Drivers/ |
| Вернуться наверх |
|
|
Anjeyka |
Заголовок сообщения:
|
|
|
|
| Вернуться наверх |
|
|
TOMMM |
Заголовок сообщения: Re: DSB-C320;Error 80004002
|
|
|
Alex_Merk писал(а): Прошу помощи! подскажи как решить данную проблему …. |
| Вернуться наверх |
|
|
Anjeyka |
Заголовок сообщения:
|
|
|
|
| Вернуться наверх |
|
|
TOMMM |
Заголовок сообщения:
|
|
|
Anjeyka писал(а): попробуй этот драйвер http://files.mail.ru/SHLAN6 линк активен до 8.02.2010 думаю мож админы очнутся.. послушаю их |
| Вернуться наверх |
|
|
Anjeyka |
Заголовок сообщения:
|
|
|
TOMMM писал(а): думаю мож админы очнутся.. послушаю их я не дождался … юзай родной драйвер с диска или ищи по коду устройства в «диспечере устройств» удачи |
| Вернуться наверх |
|
|
Nikita Schekotov |
Заголовок сообщения: Re: DSB-C320;Error 80004002
|
|
|
TOMMM писал(а): подскажи как решить данную проблему …. Пришлите скриншоты установки и ошибки на почту |
| Вернуться наверх |
|
|
MiKxA |
Заголовок сообщения:
|
|
|
Впервый раз камера установилась и заработала, но через какое-то время из-за работы другой программы компьтер показал «синий экран» и перезагрузился. После этого камера оказалась не установленной. повторная установка — uninstall — установка сопровождалась ошибкой при установке (Filed to setup driver:5) и требованием найти какие-то файлы dll. Эти файлы я нашел поиском в системных папках и указал по требованию программы их местонахождение. После чего было сообщение, что на компьютер камера установлена. Но при попытке включить камеру в «Мой компьютер» выходит сообщение «Сбой предварительного просмотра видео» с содержанием «Не удалось создать предварительный просмотр видео. Убедитесь, что это устройство подключено, и что просмотр видеосигнала с этого устройства не выполняется другом приложении.» А при запуске самой программы AMCap «ошибка Error 80004002: Cannot find VCapture:IAMStreamConfig» |
| Вернуться наверх |
|
|
Nikita Schekotov |
Заголовок сообщения:
|
|
|
|
| Вернуться наверх |
|
Кто сейчас на форуме |
|
Сейчас этот форум просматривают: 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 задайте свой вопрос.