В основном потому, что сам API относится к древним временам, когда сегментирование длинных записей не было самой важной функцией, делать сегментированное написание с помощью DirectShow нелегко. Это невозможно при использовании стандартного API, предоставляемого операционной системой, и требует определенных усилий со сторонними фильтрами и / или разработкой.
Основная проблема, с которой вы столкнулись, заключается в том, что конвейер мультимедиа не позволяет переходить из одного состояния в другое: веб-камера не может быть активной, когда записанный файл закрыт, завершен, открыт и повторно сегментирован.
Таким образом, вы должны решить проблему одним из двух способов:
- Вы можете заменить фильтры мультиплексора и записи на пользовательский фильтр, который сегментирует запись внутри, и завершить текущий файл, начиная новый, без потери кадра.
Поскольку вы занимаетесь разработкой на C #, эта опция в основном предполагает, что вы, возможно, найдете готовый сторонний фильтр, который реализует необходимую функциональность.
Вы можете построить двух-графическую конструкцию с одним графиком, имеющим захват веб-камеры и опционально сжатие, затем другой, имеющий сжатие, является первым, у которого его нет, и фактически записывается в файл. Затем данные передаются между графиками, и когда дело доходит до сегментирования, вы останавливаете второй график, завершающий создание файла, затем запускаете новый файл там, и первый график всегда работает без перерыва, предоставляя новые видеокадры. Клеевой слой, который соединяется с графиками, может быть разработан индивидуально, или вы можете проверить фильтры GMFBridge , которые популярны и используются довольно многими пользователями.
Насколько мне известно, вы можете использовать GMFBridge для построения двухграфовых топологий с сегментированием выходных файлов, хотя может потребоваться, чтобы вы проверили исходный код, чтобы выяснить, как фильтры используются правильно и что требуется для их создания работа в этом сценарии захвата видео в реальном времени.