witam wszystkich.
Mam taki problem. Otóż muszę napisać program, który będzie dodatkowo posiadał funkcję przechwytu obrazu z dwóch kamer przemysłowych. Popełniłem kiedyś coś podobnego na dspacku (z tym, że tylko dla kamerki internetowej - wszystko było OK). Korzystając ponownie z demosa PlayVideoCap napisałem coś podobnego. I zaczęły się schody. Obraz z kamer pobierany jest przez kartę video (4-channels PCI). W przykładzie PlayVideoCap nie ma nawet tego urządzenia na liście Devices. (Dodam, że na oryginalnym programie dołączonym do karty wszystko gra). Spróbowałem również w GrapEdit i tam taka sama sytuacja (to urządzenie nie istnieje). Wymieniłem kartę PCI na kartę video 4 channels - USB. Zarówno w delphi jak i w graphEdit widzę urządzenie. Wydawałoby się, że wszystko OK. Niestety nie wyświetla żadnego obrazu. Nie wiem co robię źle. Proszę pomocy!!!
0
0
HRESULT __fastcall TDXTarczka::CaptureVideo()
{
HRESULT hr;
// IBaseFilter *pSrcFilter=NULL; JAK CO TO ODKOMENTOWAC
// Get DirectShow interfaces
hr = GetInterfaces();
if (FAILED(hr))
{
// Msg(TEXT("Failed to get video interfaces! hr=0x%x"), hr);
return hr;
}
// Attach the filter graph to the capture graph
hr = g_pCapture->SetFiltergraph(g_pGraph);
if (FAILED(hr))
{
// Msg(TEXT("Failed to set capture filter graph! hr=0x%x"), hr);
return hr;
}
g_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&g_pMediaControl);
// Use the system device enumerator and class enumerator to find
// a video capture/preview device, such as a desktop USB video camera.
hr = FindCaptureDevice(&pSrcFilter);
if (FAILED(hr))
{
// Don't display a message because FindCaptureDevice will handle it
return hr;
}
// Add Capture filter to our graph.
hr = g_pGraph->AddFilter(pSrcFilter, L"Video Capture");
// hr = m_pFilterGraph->AddFilter(m_pGrabberF, L"Sample Grabber"); TO JEST GRABBIN FRAME'a
if (FAILED(hr))
{
// Msg(TEXT("Couldn't add the capture filter to the graph! hr=0x%x\r\n\r\n")
// TEXT("If you have a working video capture device, please make sure\r\n")
// TEXT("that it is connected and is not being used by another application.\r\n\r\n")
// TEXT("The sample will now close."), hr);
pSrcFilter->Release();
return hr;
}
// Render the preview pin on the video capture filter
// Use this instead of g_pGraph->RenderFile
hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pSrcFilter, NULL, NULL);
if (FAILED(hr))
{
pSrcFilter->Release();
return hr;
}
// Now that the filter has been added to the graph and we have
// rendered its stream, we can release this reference to the filter.
pSrcFilter->Release();
// KURWAT->GetCurrentBuffer()
// Set video window style and position
hr = SetupVideoWindow();
// if (FAILED(hr))
// {
// Msg(TEXT("Couldn't initialize video window! hr=0x%x"), hr);
// return hr;
// }
//#ifdef REGISTER_FILTERGRAPH
// // Add our graph to the running object table, which will allow
// // the GraphEdit application to "spy" on our graph
// hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister);
//
//#endif
// Start previewing video data
hr = g_pMC->Run();
if (FAILED(hr))
{
return hr;
}
// Remember current state
g_psCurrent = Running;
return S_OK;
}
HRESULT __fastcall TDXTarczka::FindCaptureDevice(IBaseFilter ** ppSrcFilter)
{
HRESULT hr;
IBaseFilter * pSrc = NULL;
CComPtr <IMoniker> pMoniker =NULL;
ULONG cFetched;
if (!ppSrcFilter)
return E_POINTER;
// Create the system device enumerator
CComPtr <ICreateDevEnum> pDevEnum =NULL;
hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **) &pDevEnum);
if (FAILED(hr))
{
// Msg(TEXT("Couldn't create system enumerator! hr=0x%x"), hr);
return hr;
}
// Create an enumerator for the video capture devices
CComPtr <IEnumMoniker> pClassEnum = NULL;
hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if (FAILED(hr))
{
// Msg(TEXT("Couldn't create class enumerator! hr=0x%x"), hr);
return hr;
}
// If there are no enumerators for the requested type, then
// CreateClassEnumerator will succeed, but pClassEnum will be NULL.
if (pClassEnum == NULL)
{
// MessageBox(ghApp,TEXT("No video capture device was detected.\r\n\r\n")
// TEXT("This sample requires a video capture device, such as a USB WebCam,\r\n")
// TEXT("to be installed and working properly. The sample will now close."),
// TEXT("No Video Capture Hardware"), MB_OK | MB_ICONINFORMATION);
return E_FAIL;
}
// Use the first video capture device on the device list.
// Note that if the Next() call succeeds but there are no monikers,
// it will return S_FALSE (which is not a failure). Therefore, we
// check that the return code is S_OK instead of using SUCCEEDED() macro.
if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
{
// Bind Moniker to a filter object
hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
if (FAILED(hr))
{
// Msg(TEXT("Couldn't bind moniker to filter object! hr=0x%x"), hr);
return hr;
}
}
else
{
// Msg(TEXT("Unable to access video capture device!"));
return E_FAIL;
}
// Copy the found filter pointer to the output parameter.
// Do NOT Release() the reference, since it will still be used
// by the calling function.
*ppSrcFilter = pSrc;
return hr;
}
HRESULT __fastcall TDXTarczka::GetInterfaces(void)
{
HRESULT hr;
// Create the filter graph
hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &g_pGraph);
if (FAILED(hr))
return hr;
// Create the capture graph builder
hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &g_pCapture);
if (FAILED(hr))
return hr;
// Obtain interfaces for media control and Video Window
hr = g_pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC);
if (FAILED(hr))
return hr;
hr = g_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW);
if (FAILED(hr))
return hr;
hr = g_pGraph->QueryInterface(IID_IMediaEvent, (LPVOID *) &g_pME);
if (FAILED(hr))
return hr;
// Set the window handle used to process graph events
// hr = g_pME->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0); odkomentowac
//
return hr;
}
void __fastcall TDXTarczka::CloseInterfaces(void)
{
// Stop previewing data
if (g_pMC)
g_pMC->StopWhenReady();
g_psCurrent = Stopped;
// Stop receiving events
// if (g_pME)
// g_pME->SetNotifyWindow(NULL, WM_GRAPHNOTIFY, 0); odkomentowac
// Relinquish ownership (IMPORTANT!) of the video window.
// Failing to call put_Owner can lead to assert failures within
// the video renderer, as it still assumes that it has a valid
// parent window.
if(g_pVW)
{
// g_pVW->
g_pVW->put_Visible(OAFALSE);
g_pVW->put_Owner(NULL);
}
//#ifdef REGISTER_FILTERGRAPH
// // Remove filter graph from the running object table
// if (g_dwGraphRegister)
// RemoveGraphFromRot(g_dwGraphRegister);
//#endif
// Release DirectShow interfaces
SAFERELEASE(g_pMC);
SAFERELEASE(g_pME);
SAFERELEASE(g_pVW);
SAFERELEASE(g_pGraph);
SAFERELEASE(g_pCapture);
}
HRESULT __fastcall TDXTarczka::SetupVideoWindow(void)
{
HRESULT hr; // g_pVW->
// Set the video window to be a child of the main window
hr = g_pVW->put_Owner((OAHWND)((TWinControl*)AWEBCAMParent)->Handle);
if (FAILED(hr))
return hr;
// Set video window style
hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
if (FAILED(hr))
return hr;
// Use helper function to position video window in client rect
// of main application window
ResizeVideoWindow();
// Make the video window visible, now that it is properly positioned
hr = g_pVW->put_Visible(OATRUE);
if (FAILED(hr))
return hr;
return hr;
}
void __fastcall TDXTarczka::ResizeVideoWindow(void)
{
// Resize the video preview window to match owner window size
if (g_pVW)
{
RECT rc;
// Make the preview video fill our window
GetClientRect(((TWinControl*)AWEBCAMParent)->Handle, &rc);
// g_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);
}
}
HRESULT __fastcall TDXTarczka::ChangePreviewState(int nShow)
{
HRESULT hr=S_OK;
// If the media control interface isn't ready, don't call it
if (!g_pMC)
return S_OK;
if (nShow)
{
if (g_psCurrent != Running)
{
// Start previewing video data
hr = g_pMC->Run();
g_psCurrent = Running;
}
}
else
{
// Stop previewing video data
hr = g_pMC->StopWhenReady();
g_psCurrent = Stopped;
}
return hr;
}
Jak nie ma sterownikow do kamery to nie wiem czy wykryje
0
Dzięki wielkie za podpowiedź.
Niestety wszystko jest w C. Nie wiem czy sobie poradzę. Bardziej bym potrzebował w Delphi. ale może coś się uda poprzerabiać. Dam znać.