Here's some code (from the german forums) using a dedicated filtergraph, maybe that helps:
Code: Select all
;
; http://forums.purebasic.com/german/viewtopic.php?t=1054
;
#CLSCTX_INPROC_SERVER = $1
#VFW_E_NOT_FOUND = $80040216
#MAX_FILTER_NAME = 128
Structure FilterInfo
achName.b[#MAX_FILTER_NAME]
lpFilterGraph.IFilterGraph
EndStructure
Enumeration
#PINDIR_INPUT
#PINDIR_OUTPUT
EndEnumeration
CoInitialize_(0)
Debug CoCreateInstance_(?CLSID_FilterGraph, #NULL,#CLSCTX_INPROC_SERVER,?IID_IGraphBuilder,@lpGB.IGraphBuilder)
Debug lpGB\QueryInterface(?IID_IMediaControl,@lpMC.IMediaControl)
Debug CoCreateInstance_(?CLSID_Source_Filter, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpSource_Filter.IBaseFilter)
Debug CoCreateInstance_(?CLSID_Avi_Decompressor, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpAvi_Decompressor.IBaseFilter)
Debug CoCreateInstance_(?CLSID_VideoRenderer, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpVRender.IBaseFilter)
file.s = "I:\Clock.avi"
; SOURCE Filter
Dim wavFile.w(Len(file))
MultiByteToWideChar_(#CP_ACP, 0, file, -1, wavFile(), Len(file))
Debug 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
Debug lpSource_FilterPinOut
;AVI_Decompressor
Debug lpGB\AddFilter(lpAvi_Decompressor, @"AVI_Decompressor")
lpAvi_Decompressor\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.IPin,0) = #S_OK
lpPin\QueryDirection(@a)
If a = #PINDIR_OUTPUT
lpAvi_DecompressorPinOut = lpPin
EndIf
If a = #PINDIR_INPUT
lpAvi_DecompressorPinIn = lpPin
EndIf
Wend
Debug lpAvi_DecompressorPinIn
Debug lpAvi_DecompressorPinOut
; Renderer
Debug 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
Debug lpVRenderPinIn
; Pins verbinden
Debug lpGB\Connect(lpSource_FilterPinOut,lpAvi_DecompressorPinIn)
Debug lpGB\Connect(lpAvi_DecompressorPinOut,lpVRenderPinIn)
; Verwendete Filter anzeigen
Debug 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()
; Freigabe
lpFilter\Release()
lpEnum\Release()
lpPin\Release()
lpNUM\Release()
lpVRender\Release()
lpAvi_Decompressor\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
CLSID_Avi_Splitter:
Data.l $1B544C20
Data.w $FD0B,$11CE
Data.b $8C,$63,$00,$AA,$00,$44,$B5,$1E
IID_IBaseFilter:
Data.l $56A86895
Data.w $0AD4,$11CE
Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
CLSID_Avi_Decompressor:
Data.l $CF49D4E0
Data.w $1115,$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