Что может заставить push-фильтр DirectShow выталкивать данные быстрее, чем ожидалось? - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть 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) Какая распространенная ошибка может привести к тому, что фильтр слишком быстро вытеснит буферы, несмотря на однородный формат медиа по всему графику?

1 Ответ

3 голосов
/ 19 ноября 2011

В DirectShow исходные / push-установщики обычно бывают живыми или не живыми. Как ввод данных в конвейер, так и важное отличие состоит в том, что живой фильтр передает данные как можно скорее, как только он генерирует, получает извне конвейера (например, из сети) и т. Д.

Неживой фильтр выталкивает столько данных, сколько может. Установщик, который воспроизводит 5-минутный файл MP3? Он готов ввести все пять минут сразу. Задача фильтра рендеринга - блокировать потоковую передачу, когда больше нет доступных буферов, и соблюдать время представления. Поэтому, когда исходный фильтр загружает 100% буферов, он просто больше не может выдвигать ничего, пока буферы не будут освобождены при воспроизведении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...