, как я упоминал в заголовке, я хотел бы добавить File Writer в график образца GSSF вместо его рендеринга.
На самом деле, я действительно пытаюсь добиться, добавить второй файлФильтр источника, затем подключите GSSF и фильтр источника файла к AVI Mux и, наконец, к File Writer.
GSSF + Источник файла -> AVI MUX -> File Writer.
Но первыйодин шаг очень помог бы.
Моя цель - создать видео с 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;
}