У меня есть push-фильтр DirectShow и простой фильтр микшера DirectShow, оба написаны на Delphi 6 с помощью библиотеки компонентов DSPACK. В моем приложении я строю график фильтра вручную, а для соединений выводов я использую IFilterGraph.ConnectDirect (), чтобы избежать любых помех от технологии «интеллектуального соединения» DirectShow. Я использую оба этих фильтра как частные / незарегистрированные фильтры, встроенные в мою программу.
График, который я строю, имеет фильтр захвата и мой аудиоисточник push-источника, разделяющий положение головы графика. Их выходные контакты подключены к моему простому звуковому микшеру, последний поддерживает несколько входных соединений. Микшер принудительно заставляет все соединения к его входным и выходным контактам иметь тот же тип формата мультимедиа, который задан в его конструкторе. В этом случае настройка формата, которую я использую, - это формат WAV с частотой дискретизации 8000, 16 бит на выборку и один канал. Обратите внимание, я использую DecideBufferSize (), чтобы установить для всех фильтров размер буфера 50 миллисекунд. Это приводит к доставке буферов размером 400 байт (200 выборок).
Фильтр захвата - это внешний COM-объект, который я нахожу с помощью DirectShow API. В настоящее время я назначаю свой VOIP-телефон в качестве устройства (Moniker). По какой-то странной причине мой фильтр принудительного источника откачивает буферы со скоростью ровно в 7 раз выше, чем у фильтра захвата. Другими словами, мой фильтр микшера получает 7 буферов от моего фильтра push-источника для каждого буфера, который он получает от фильтра захвата. Я знаю это, потому что я отлаживаю вывод строки каждый раз, когда фильтр микшера получает буфер, и идентифицирую фильтр, который является источником буфера.
Я не знаю, как фильтр захвата формирует свои временные метки, поскольку это внешний код, но я ожидаю, что это обычная схема. Мой исходный фильтр push начинается с нуля, и с каждым вызовом FillBuffer () увеличивается временная метка в формате эталонного времени DirectShow на количество времени, которое представляет буфер.
Вот мои вопросы:
1) Должны ли метки времени иметь значение, если я строю график вручную? Получает ли DirectShow промежуточные фильтры и может как-то влиять на время записи контактов (получение вызовов), даже если вы строите график полностью вручную?
2) Какая распространенная ошибка может привести к тому, что фильтр слишком быстро вытеснит буферы, несмотря на однородный формат медиа по всему графику?