SmartTee过滤器和保存到文件

本文关键字:存到文件 过滤器 SmartTee | 更新日期: 2023-09-27 18:13:37

如果我使用智能tee滤镜,我如何将视频流从网络摄像头渲染到文件?添加SmartTee滤镜,得到如下内容:

Capture filter
        |
    SmartTee filter
    |           |
capture     preview
    |           |
Mux filter  GrabFilter
    |           |
FileWriter  VideoRenderer

这就是连接捕获过滤器和智能tee:

// Get capture filter
srcFilter = FindCaptureDevice();
// Add Capture filter to our graph.
graph.AddFilter(srcFilter, "Video Capture");
//Add smartTee filter to graph
smartTeeFilter = (IBaseFilter)new SmartTee();
graph.AddFilter(smartTeeFilter, "Smart Tee");
IPin outPin = GetPin(PinDirection.Output, srcFilter);
IPin inPin = GetPin(PinDirection.Input, smartTeeFilter);
graph.Connect(outPin, inPin);

这是与抓取器和渲染(以防万一)的连接:

sampGrabber = new SampleGrabber() as ISampleGrabber;
baseGrabFilter = sampGrabber as IBaseFilter;
graph.AddFilter(baseGrabFilter, "Grabber");
IPin sourcePin, grabPin;
sourcePin = GetPin(PinDirection.Output, smartTeeFilter);
grabPin = GetPin(PinDirection.Input, baseGrabFilter);           
graph.Connect(sourcePin, grabPin);
graph.Render(GetPin(PinDirection.Output, baseGrabFilter));

这就是我在保存文件部分的全部内容:

IBaseFilter mux;
IFileSinkFilter sink;
capture.SetOutputFileName(
    MediaSubType.Avi,      // Specifies AVI for the target file.
    path,                  // File name.
    out mux,               // Receives a pointer to the mux.
    out sink);             // (Optional) Receives a pointer to the file sink.
sink.SetFileName(path, null);
IPin outPin = DsFindPin.ByDirection(smartTeeFilter, PinDirection.Output, 1);
IPin inPin = GetPin(PinDirection.Input, mux);
graph.Connect(outPin, inPin);
control.Run();

没有抛出异常。刚刚创建大小为64Kb的文件。我保存到文件代码有什么问题?

补充道。我检查了CapWMV的例子,在那里保存是这样的:

IFileSinkFilter sink = null;
IBaseFilter fileWriterFilter = null;
capture = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
capture.SetFiltergraph(graph);
int hr = capture.SetOutputFileName(MediaSubType.Avi, path, out fileWriterFilter, out sink);
DsError.ThrowExceptionForHR(hr);
hr = capture.RenderStream(null, null, smartTeeFilter, null, fileWriterFilter);
DsError.ThrowExceptionForHR(hr);
hr = control.Run();
DsError.ThrowExceptionForHR(hr);

我又得到了64kb的文件。我错在哪里?

SmartTee过滤器和保存到文件

顶部的拓扑结构大约在右边。

你的代码然而不匹配它:你连接多路复用器输入,然后你Run。没有代码存在或显示连接多路复用器输出,这是强制性的。

下一件事是,由于Intelligent Connect自动提供的过滤器,您的实际拓扑可能与预期不同,您也需要通过枚举过滤器或发布到ROT并使用外部工具查看来检查这一点。

如果您有机会查看真实的拓扑,您可能会立即掌握问题:

IPin sourcePin, grabPin;
sourcePin = GetPin(PinDirection.Output, smartTeeFilter);
grabPin = GetPin(PinDirection.Input, baseGrabFilter);           
graph.Connect(sourcePin, grabPin);

您正在连接第一个抓取输出引脚到样本抓取器和预览视频渲染器。但是,索引零输出引脚是Capture:

捕获引脚为输出引脚0,预览引脚为输出引脚1。

所以你正在写预览(永恒的)媒体样本到一个文件,它不会工作,所以你需要连接tee输出引脚正确-所以tee的捕获输出连接到mux/writer腿。