我正在尝试使用 GMFBuilder,以便我可以预览来自网络摄像头的流并定期保存,而无需重新启动整个图表。但是我不确定这是否正确,我试图按照示例进行操作,但代码已更新并且情况发生了变化。
我尝试创建:
WEbcam -> Smart Tee (preview) -> AVI Decompressor -> Video Renderer
Smart Tee (Capture) -> BridgeSinkFilter
并且:
BridgeSourceFilter -> ffdshow video encoder -> haali mastroska muxer
(只是因为它易于使用)
关于让代码正常运行的输入将不胜感激。
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();
}