У меня есть фильтр DirectShow Transform, написанный на Delphi 6 с использованием библиотеки компонентов DSPACK.Это простой аудиомикшер, который создает новый входной контакт при каждом новом подключении.Я говорю просто, потому что, как только его медиаформат установлен, все соединения с его входными или выходными контактами вынуждены соответствовать этому медиа формату.Я строю цепочку фильтров вручную, делая все соединения выводов самостоятельно.Я не использую какие-либо вызовы «интеллектуального рендеринга», если только нет какого-либо способа случайно вызвать это нежелательное поведение (в моем случае).
ПРИМЕЧАНИЕ. Фильтр захвата - это стандартный внешний фильтр DirectShow.к моему заявлению.Мой аудио-фильтр push-источника и простые фильтры аудио-микшера используются как частные, незарегистрированные фильтры и являются внутренними для моего приложения.
У меня странная проблема, которая возникает, только когда я пытаюсь сделать множественный вводсоединения с моим микшером, который действительно принимает их.В настоящее время я пытаюсь подключить и фильтр захвата, и мой пользовательский аудио-фильтр Push Source к моему фильтру микшера.Всякий раз, когда я пытаюсь это сделать, происходит сбой подключения второго фильтра обратного потока.Независимо от того, подключаю ли я сначала фильтр захвата или аудиофильтр с принудительным исходным кодом, сначала соединение второго вышестоящего фильтра всегда терпит неудачу.
Первый тест, который я запустил, был попытаться подключить только фильтр захвата к микшеру.Это работало нормально.
Второй тест, который я запустил, состоял в том, чтобы попытаться подключить только аудио фильтр Push Source к микшеру.Это сработало нормально.
Но как только я попытался сделать то и другое, я получил ошибку "не удалось найти комбинацию промежуточных фильтров".Я провел несколько часов, глубоко копаясь в переговорах по медиа, обращаясь к моему фильтру из построителя графиков, и затем я нашел проблему.По какой-то причине граф фильтра перетаскивает древний кодек Indeo (R) Audio Software в цепочку.
Я обнаружил это, потому что, несмотря на тот факт, что кодек действительно имел формат мультимедиа, который соответствовал моему фильтру в почти во всех отношениях (основной тип, подтип, тип формата, параметры формата волны), онв конце элемента данных pbFormat имелось 2 дополнительных байта, и этого было достаточно, чтобы не пройти тест равно , поскольку этот тест выполняет сравнение между исходной и целевой областями pbFormat путем сравнения значения cbFormat каждого типа мультимедиа,Кодек Indeo имеет значение cbFormat, равное 20, а мой фильтр имеет значение cbFormat, равное 18, что соответствует размеру структуры данных _tWAVEFORMATEX.В некотором смысле хорошо, что Indeo pbFormat имеет такой странный размер, потому что первые 18 байтов из его 20-байтовой области были точно равны области pbFormat поддерживаемого моим типом носителя фильтра микшера.Без этой аномалии я бы никогда не узнал, что в древнем кодеке вводили наркотики. Я удивлен, что он вообще вводит наркотики, поскольку в нем есть известные подвиги и уязвимости.Что больше всего сбивает с толку, так это то, что это происходит на выводе моего микшерного фильтра, а не на одном из входных выводов, и Я еще не сделал ни одного нисходящего соединения при создании моего выводаподключений.
Может кто-нибудь сказать мне, почему DirectShow пытается перетащить в этот кодек, несмотря на тот факт, что форматы мультимедиа для обоих входящих фильтров, фильтра захвата и фильтра Push Source, идентичны и не нужныпромежуточные фильтры вообще, так как они точно соответствуют формату входных контактов моего фильтра микшера?Как я могу решить эту проблему?
Кроме того, я заметил, что даже в приведенных выше тестах на присоединение одного фильтра мой вывод микшера все еще запрашивался для медиаформатов.Почему, как я уже сказал, в этот момент при создании моих контактов я ничего не подключил к выходному контакту моего фильтра микшера?
--------------------------- ОБНОВЛЕНИЕ: 1 ----------------------------
Я узнал, что вы можете полностью избежать поведения «интеллектуального соединения», используя IFilterGraph.ConnectDirect () вместо IGraphBuilder.Connect ().Я переключился на DirectConnect () и оказалось, что входной контакт на моем фильтре микшера возвращается как «уже подключен».Это может быть причиной перетаскивания построителя графиков в фильтр кодеков Indeo.Теперь, когда у меня есть новая диагностическая информация, я исправлю проблему и обновлю этот пост своими результатами.