【问题标题】:SmartTee filter and saving to fileSmartTee 过滤器并保存到文件
【发布时间】:2013-05-15 15:08:38
【问题描述】:

如果我使用智能 tee 过滤器,如何将视频流从网络摄像头渲染到文件? 所以我添加了 SmartTee 过滤器并得到类似的东西:

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

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

// 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);

我又得到了 64 Kb 的文件,没有别的了。我的错在哪里?

【问题讨论】:

  • HALP ME GUYZ,我被困住了。它只是保存到文件中。没有 smart tee 它是两行代码。不能太复杂。

标签: c# video directshow video-capture directshow.net


【解决方案1】:

上面的拓扑是差不多的。

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

接下来,您的实际拓扑可能与预期不同,因为 Intelligent Connect 自动提供了过滤器,您还需要通过枚举过滤器或publishing to ROT and viewing with external tool 来查看这一点。

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

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

您正在将第一个抓取的输出引脚连接到 Sample Grabber 和预览视频渲染器。但是,index zero output pin is Capture

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

因此,您正在将预览(永恒)媒体样本写入文件,它不会工作,因此您需要正确连接 tee 输出引脚 - 以便 tee 的捕获输出连接到多路复用器/写入器支路。

【讨论】:

  • 哦,对了,mux 和文件编写器之间没有任何联系。现在我知道我不知道该怎么做。所以这让我想到了一个愚蠢的问题:如何连接多路复用器和文件编写器?
  • 获取引脚并对它们执行graph.Connect,就像连接其他对一样。
  • 是的,但我应该使用sink 作为IBaseFiler 还是别的什么?
  • 与您已经在提供的代码上所做的相比,没有什么新东西。您有过滤器,它们有引脚,引脚已连接。因此,您可以找到感兴趣的引脚并将它们连接起来。
  • 我明白了。但我不知道最后应该使用哪个过滤器。如果我使用sinkmux 连接,我会得到“找不到中间过滤器的组合来建立连接”。我应该使用什么过滤器以及如何创建它?
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多