正如我在标题中提到的,我想在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;
}