Как я могу просмотреть и захватить в DirectShow с сегментированными выходными файлами? - PullRequest
0 голосов
/ 10 января 2019

Я использую c # и DirectShow.NET вместе с некоторым примером кода, найденным в Интернете, чтобы попытаться отобразить текущий вывод веб-камеры в реальном времени в окне моего приложения и вывести видео в файлы.

В настоящее время я использую ICaptureGraphBuilder2 для создания графика и вывода одного выходного файла, и это работает. Но на самом деле у меня есть более подробное требование, которое я не могу понять, как реализовать:

При записи я хочу иметь возможность разделить вывод на 5-минутные сегменты, как параметр -segment в ffmpeg . Насколько я могу судить, ICaptureGraphBuilder2 выбирает средство записи файлов для вас, и средство записи по умолчанию просто продолжает добавлять к тому же файлу. Как это можно настроить? Как я могу реализовать собственный писатель и заставить график использовать его вместо этого?

1 Ответ

0 голосов
/ 11 января 2019

В основном потому, что сам API относится к древним временам, когда сегментирование длинных записей не было самой важной функцией, делать сегментированное написание с помощью DirectShow нелегко. Это невозможно при использовании стандартного API, предоставляемого операционной системой, и требует определенных усилий со сторонними фильтрами и / или разработкой.

Основная проблема, с которой вы столкнулись, заключается в том, что конвейер мультимедиа не позволяет переходить из одного состояния в другое: веб-камера не может быть активной, когда записанный файл закрыт, завершен, открыт и повторно сегментирован.

Таким образом, вы должны решить проблему одним из двух способов:

  1. Вы можете заменить фильтры мультиплексора и записи на пользовательский фильтр, который сегментирует запись внутри, и завершить текущий файл, начиная новый, без потери кадра.

Поскольку вы занимаетесь разработкой на C #, эта опция в основном предполагает, что вы, возможно, найдете готовый сторонний фильтр, который реализует необходимую функциональность.

  1. Вы можете построить двух-графическую конструкцию с одним графиком, имеющим захват веб-камеры и опционально сжатие, затем другой, имеющий сжатие, является первым, у которого его нет, и фактически записывается в файл. Затем данные передаются между графиками, и когда дело доходит до сегментирования, вы останавливаете второй график, завершающий создание файла, затем запускаете новый файл там, и первый график всегда работает без перерыва, предоставляя новые видеокадры. Клеевой слой, который соединяется с графиками, может быть разработан индивидуально, или вы можете проверить фильтры GMFBridge , которые популярны и используются довольно многими пользователями.

Насколько мне известно, вы можете использовать GMFBridge для построения двухграфовых топологий с сегментированием выходных файлов, хотя может потребоваться, чтобы вы проверили исходный код, чтобы выяснить, как фильтры используются правильно и что требуется для их создания работа в этом сценарии захвата видео в реальном времени.

...