Hallo
ich bin damals einen anderen Weg gegangen. Bei meinen unvollendeteten Projekt (Tracking Software für Teleskop) wollte ich anhand einer Webcam einen Stern fixieren und anhand diesen Stern das Teleskop nachführen.
wie sich herausstellte, war meine (
CAM) ziemlich zickig ... daher bin ich den weg über DDShow gegangen...
hab leider jetzt den Code zur CAM nicht zur Hand ...(kann ich bei interesse nachreichen) ... aber lief im Prinzip so ab
habe mir über
GraphEdit ... einen passenden graphen gebastelt und diesen per PB nachgebaut. Das Stichwort zum Snappen der Bilder ist "samplegrapper" dieser muss noch in den graphen ergänzt werden. Um ein speicherbares Bild bmp zu erhalten muß man noch den BMP header ergänzen ....
Hat eigentlich sehr gut geklappt.
analogie zur Filtergraphen:
Code: Alles auswählen
file.s = "D:\1.avi" ; anpassen
#CLSCTX_INPROC_SERVER = $1
#MAX_FILTER_NAME = 128
Structure FilterInfo
achName.b[#MAX_FILTER_NAME]
lpFilterGraph.IFilterGraph
EndStructure
Enumeration
#PINDIR_INPUT
#PINDIR_OUTPUT
EndEnumeration
CoInitialize_(0)
CoCreateInstance_ (?CLSID_FilterGraph, #Null,#CLSCTX_INPROC_SERVER,?IID_IGraphBuilder,@lpGB.IGraphBuilder)
lpGB\QueryInterface(?IID_IMediaControl,@lpMC.IMediaControl)
CoCreateInstance_ (?CLSID_Source_Filter, #Null, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpSource_Filter.IBaseFilter)
CoCreateInstance_ (?CLSID_VideoRenderer, #Null, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpVRender.IBaseFilter)
; SOURCE Filter
Dim wavFile.w(Len(file))
MultiByteToWideChar_(#CP_ACP, 0, file, -1, wavFile(), Len(file))
lpGB\AddSourceFilter(@wavFile(), @wavFile(), @lpSource_Filter)
lpSource_Filter\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.IPin,0) = #S_OK
lpPin\QueryDirection(@a)
If a = #PINDIR_OUTPUT
lpSource_FilterPinOut = lpPin
EndIf
Wend
; Renderer
lpGB\AddFilter(lpVRender, @"Video_Renderer")
lpVRender\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.Ipin,0) = #S_OK
lpPin\QueryDirection(@a)
If a = #PINDIR_INPUT
lpVRenderPinIn = lpPin
EndIf
Wend
; Pins verbinden
lpGB\Connect(lpSource_FilterPinOut,lpVRenderPinIn)
; Verwendete Filter anzeigen
lpGB\EnumFilters(@lpEnum.IEnumFilters)
While lpEnum\Next(1,@lpFilter.IBaseFilter,0) = #S_OK
lpFilter\QueryFilterinfo(@info.FilterInfo)
Debug PeekS(@info\achName)
Wend
; Wiedergabe starten
lpMC\Run()
OpenWindow(0,500,500,100,100,"Test")
Repeat
Select WindowEvent()
Case 0
Delay(1)
Case #PB_Event_CloseWindow
quit = #True
EndSelect
Until quit = #True
; Freigabe
lpFilter\Release()
lpEnum\Release()
lpPin\Release()
lpNUM\Release()
lpVRender\Release()
lpSource_Filter\Release()
lpMC\Release()
lpGB\Release()
CoUninitialize_()
DataSection
CLSID_FilterGraph:
Data.l $E436EBB3
Data.w $524F,$11CE
Data.b $9F,$53,$00,$20,$AF,$0B,$A7,$70
IID_IGraphBuilder:
Data.l $56A868A9
Data.W $0AD4,$11CE
Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
CLSID_Source_Filter:
Data.l $D3588AB0
Data.w $0781,$11CE
Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
IID_IBaseFilter:
Data.l $56A86895
Data.w $0AD4,$11CE
Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
CLSID_VideoRenderer:
Data.l $70E102B0
Data.w $5556,$11CE
Data.b $97,$C0,$00,$AA,$00,$55,$59,$5A
IID_IMediaControl:
Data.l $56A868B1
Data.w $0AD4,$11CE
Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
EndDataSection
mfg
Andi256