将文件编写器添加到GSSF示例

时间:2019-03-21 13:05:42

标签: c# directshow

正如我在标题中提到的,我想在GSSF Sample的图形中添加一个File Writer,而不是渲染它。

实际上,我真正想要实现的是添加第二个文件源过滤器,然后将GSSF和文件源过滤器连接到AVI Mux,最后连接到文件编写器。

GSSF +文件源-> AVI MUX->文件编写器。

但是仅第一步就可以帮助很多。

我的目标是创建具有2个来源的视频:

1-我的桌面截图

2-另一个视频(已经用摄像头录制),两个源也必须同步 我已经创建了一个带有2个视频源等的图形。。但是我找不到如何延迟其中一个源的图。我需要文件源1的启动时间比第二个文件源晚几毫秒。

关于将文件编写器添加到GSSF示例图上的尝试,我尝试了以下方法

// Add the filter to the graph
hr = m_FilterGraph.AddFilter(ipsb, "GenericSampleSourceFilter");
Marshal.ThrowExceptionForHR( hr );

这些行:

//add File writer
IBaseFilter pFilewriter2 = (IBaseFilter)new FileWriter();
hr = m_FilterGraph.AddFilter(pFilewriter2, "File writer");               
//set destination filename
IFileSinkFilter pFilewriter2_sink = pFilewriter2 as IFileSinkFilter;               
hr = pFilewriter2_sink.SetFileName("D:\\Test.avi", null);

//connect File writer
hr = m_FilterGraph.ConnectDirect(GetPin(ipsb, "Out"), GetPin(pFilewriter2, "in"), null);

GetPin方法:

private IPin GetPin(IBaseFilter filter, string pinname)
{
   IEnumPins epins;
   int hr = filter.EnumPins(out epins);         
   IntPtr fetched = Marshal.AllocCoTaskMem(4);
   IPin[] pins = new IPin[1];
   while (epins.Next(1, pins, fetched) == 0)
   {
      PinInfo pinfo;
      pins[0].QueryPinInfo(out pinfo);
      bool found = ((pinfo.name == pinname) || (pinfo.name.Contains(pinname)));
      DsUtils.FreePinInfo(pinfo);
      if (found) return pins[0];
   }         
   return null;
}

0 个答案:

没有答案