D
Hallo!
Ich habe jetzt wohl die richtigen Bibliotheken gefunden, sodass kompilieren ohne Fehler klappt.
Eingebunden wurden aus dem DirectShow-Verzeichnis des Direktx9-SDKs (2005) aus dem Baseclasses-Ordner:
amfilter.cpp, combase.cpp, ctlutil.cpp, mtype.cpp, renbase.cpp, wxdebug.cpp, wxlist.cpp, wxutil.cpp
includiert wurde:
#include <wxdebug.h>, #include <tchar.h>, #include <streams.h>, #include <Dshow.h>
C:\Users\Julian\Desktop\Programm\cbuilder_libs
Als bibliothekspfad wurden die cbuilder_libs from here (including strmbase.lib)
http://realmike.org/blog/projects/directx-8-borland-libs-download-page/
Als include-pfad habe ich hinzugefügt:
C:\Program Files\Microsoft DirectX 9.0 SDK (February 2005)\Extras\DirectShow\Samples\C++\DirectShow\BaseClasses
C:\Program Files\Microsoft DirectX 9.0 SDK (February 2005)\Extras\DirectShow\Include
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\atl
Nun gibt es allerdings noch das Problem mit dem tatsächlichen Auslesen.
Das Original-Beispiel hat an einigen Punkten gewisse Dinge weggelassen, die mich vor Rätsel stellen.
Ich habe eine Kamera angeschlossen und möchte gerne die Bilddaten als Byte-Array bzw. -Pointer o.ä. haben.
Ich habe schon in Erfahrung gebracht, dass ich im DoRender-Bereich die IMediaSample-Objecte in Bytearrays konvertieren kann und somit den aktuellen Frame aufrufen könnte. Nur wird dieser Teil nicht aufgerufen.
Im Breispiel wurde folgender Code angegeben:
Now, all that remains is to instantiate this class and add it to our graph.
{
HRESULT hr = S_OK;
// Create a bitmap renderer.
m_pSnapshotter = new CBitmapRenderer( _T("Bitmap renderer"), NULL, &hr );
if( FAILED(hr) )
{
Error(_T("Couldn't create bitmap renderer."));
return hr;
}
m_pSnapshotter->SetCallback( (IBitmapCallback*) this );
// Add the grabber to the graph.
CComQIPtr< IBaseFilter > pGrabBase( m_pSnapshotter );
hr = m_pGraphBuilder->AddFilter( pGrabBase, L"Snapshot" );
return hr;
}
Then, after you have added the rest of the filters to the graph and rendererd the capture stream, all you need to do is have DirectShow connect the second pin of the capture filter (which is labelled "1") to the input pin of the snapshot filter:
IBaseFilter pSourceFilter; // the camera
IGraphBuilder pGraphBuilder;
...
// Now connect the snapshot pin.
CComPtr pOutPin;
pSourceFilter->FindPin( L"1", &pOutPin );
CBasePin* pInPin = m_pSnapshotter->GetPin( 0 );
hr = m_pGraphBuilder->Connect( pOutPin, pInPin );
Ich habe das Versucht, bei mir umzuschreiben und es gibt keine Fehlermeldung, allerdings passiert auch nichts:
HRESULT hr = S_OK;
IBaseFilter* pFilter=0;
hr=CreateKernelFilter(
CLSID_VideoInputDeviceCategory,
L"Videology USB-C Camera",
&pFilter
);
CoInitialize(NULL);
CComQIPtr<IVideology20K1XX> pKs(pFilter);
if(pFilter==0)return;
hr=pKs->SetWhiteBalanceMode(wbAuto);
CBitmapRenderer *m_pSnapshotter = new CBitmapRenderer( _T("Bitmap renderer"), NULL, &hr );
if( FAILED(hr) )
{
ASSERT("Couldn't create bitmap renderer.");
return;
}
m_pSnapshotter->SetCallback( (IBitmapCallback*) this );
CComQIPtr< IBaseFilter > pGrabBase( m_pSnapshotter );
IGraphBuilder* m_pGraphBuilder=0;
hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraphBuilder);
hr = m_pGraphBuilder->AddFilter( pGrabBase, L"Snapshot" );
CComPtr<IPin> pOutPin;
hr= pFilter->FindPin( L"1", &pOutPin );
CBasePin* pInPin = m_pSnapshotter->GetPin( 0 );
m_pSnapshotter->Run(0);
hr = m_pGraphBuilder->Connect( pOutPin, pInPin );
Dabei ist noch gut zu wissen, dass alle hr=0 sind, also alles erfolgreich abläuft, bis auf das letzte hr, welches 0x8004025F ist, also VFW_E_NOT_IN_GRAPH:Description: Cannot perform the requested function on an object that is not in the filter graph.
Wisst ihr, wie man directshow richtig initialisiert?