I am trying to use the GMFBuilder so that i can preview a stream from a webcam and save it periodically without restarting the whole graph. However Im not sure if this is correct or not, I was trying to follow examples but the codes been updated and things have changed.
I try and create:
WEbcam -> Smart Tee (preview) -> AVI Decompressor -> Video Renderer
Smart Tee (Capture) -> BridgeSinkFilter
and also:
BridgeSourceFilter -> ffdshow video encoder -> haali mastroska muxer
(just cause its easy to use)
Input regarding getting the code to run properly would be greatly appreciated.
private void button2_Click(object sender, EventArgs e)
{
IGraphBuilder firstGraph = (IGraphBuilder)new FilterGraph();
IGraphBuilder secondGraph = (IGraphBuilder)new FilterGraph();
IBaseFilter BridgeSinkFilter;
IBaseFilter BridgeSourceFilter;
IBaseFilter Source;
IBaseFilter Mux;
IBaseFilter FileWriter;
IGMFBridgeController bridge = (IGMFBridgeController)new GMFBridgeController();
bridge.AddStream(1, eFormatType.eMuxInputs, 1);
BridgeSinkFilter = (IBaseFilter)bridge.InsertSinkFilter(firstGraph);
Source = FindFilter(FilterCategory.VideoInputDevice, "SG330");
firstGraph.AddFilter(Source, "source");
IBaseFilter SmartTee = FindFilter(FilterCategory.LegacyAmFilterCategory, "Smart Tee");
firstGraph.AddFilter(SmartTee, "Smart Tee");
IPin pinin, pinout;
pinout = FindPinByDirection( Source, PinDirection.Output);
pinin = FindPinByDirection( SmartTee, PinDirection.Input);
firstGraph.Connect(pinout, pinin);
pinout = FindPinByDirection(SmartTee, PinDirection.Output);
pinin = FindPinByDirection(BridgeSinkFilter, PinDirection.Input);
firstGraph.Connect(pinout, pinin);
IBaseFilter Decomp = FindFilter(FilterCategory.LegacyAmFilterCategory, "AVI Decompressor");
firstGraph.AddFilter(Decomp, "Avi Decompressor");
pinout = FindPinByDirection(SmartTee, PinDirection.Output);
pinin = FindPinByDirection(Decomp, PinDirection.Input);
firstGraph.Connect(pinout, pinin);
IBaseFilter Renderer = FindFilter(FilterCategory.LegacyAmFilterCategory, "Video Renderer");
firstGraph.AddFilter(Renderer, "Video Renderer");
pinout = FindPinByDirection(Decomp, PinDirection.Output);
pinin = FindPinByDirection(Renderer, PinDirection.Input);
firstGraph.Connect(pinout, pinin);
DsROTEntry g = new DsROTEntry(firstGraph);
BridgeSourceFilter = (IBaseFilter)bridge.InsertSourceFilter(BridgeSinkFilter, secondGraph);
DsROTEntry h = new DsROTEntry(secondGraph);
IBaseFilter Muxe = FindFilter(FilterCategory.VideoCompressorCategory, "ffdshow video encoder");
secondGraph.AddFilter(Muxe, "Mux");
pinout = FindPinByDirection(BridgeSourceFilter, PinDirection.Output);
pinin = FindPinByDirection(Muxe, PinDirection.Input);
secondGraph.Connect(pinout, pinin);
IBaseFilter MKV = FindFilter(FilterCategory.LegacyAmFilterCategory, "Haali Matroska Muxer");
IFileSinkFilter fs = (IFileSinkFilter)MKV;
fs.SetFileName("c:\\cool.mkv", null);
secondGraph.AddFilter(MKV, "mux");
pinout = FindPinByDirection(Muxe, PinDirection.Output);
pinin = FindPinByDirection(MKV, PinDirection.Input);
secondGraph.Connect(pinout, pinin);
bridge.BridgeGraphs(BridgeSinkFilter, BridgeSourceFilter);
IMediaControl mediacontrolforpartone = (IMediaControl)firstGraph;
mediacontrolforparttwo = (IMediaControl)secondGraph;
mediacontrolforpartone.Run();
mediacontrolforparttwo.Run();
}