Вставить фильтр между Avi Muxer и File Writer?

Можно ли вставить фильтр между фильтром Avi Mux и фильтром записи файлов. Построитель графов вставляет и автоматически подключает оба фильтра, вызывая ICaptureGraphBuilder2::SetOutputFileName. Поскольку интерфейс средства записи файлов имеет тип IFileSinkFilter (не производный от IBaseFilter), этот интерфейс не предоставляет никаких функций, таких как Disconnect или Connect, или для перечисления выводов фильтра. Следовательно, я не могу вставить фильтр между этими обоими фильтрами. Было ли это преднамеренно со стороны MS, чтобы оба фильтра были своего рода атомарной конструкцией? Или есть другой способ управлять этим.


person Matthias    schedule 26.06.2018    source источник


Ответы (2)


Вы можете вставить туда фильтр, но, как вы заметили, это должен быть другой фильтр. В частности, ввод File Writer Filter pin реализует интерфейс IStream. Это то, что также ожидает AVI Mux Filter. .

Если вы предоставляете совместимый фильтр, вы можете подключиться через него.

person Roman R.    schedule 26.06.2018
comment
По крайней мере, фильтр захвата проб не будет работать как промежуточный фильтр. Кажется, мне нужно написать собственный совместимый фильтр. - person Matthias; 26.06.2018

Фильтр записи файлов Microsoft предоставляет интерфейс IBaseFilter, а также IFileSinkFilter (и, возможно, другие интерфейсы). Вам просто нужно использовать QueryInterface, чтобы получить этот интерфейс (а не IFileSinkFilter, наследуемый от IBaseFilter).

IFileSinkFilter *pFileSink;
IBaseFilter* filter = NULL;
hr = pFileSink->QueryInterface( IID_IBaseFilter, (void **)&filter );

Если это неясно, убедитесь, что вы хорошо разбираетесь в COM, так как он используется в DirectShow. Также см. документацию по Microsoft DirectShow. который хорошо написан и определен:

Если вы работаете на C#, а не на C++, то, если я правильно помню, вы можете выполнять приведение между различными объектами-оболочками C# COM для автоматического QueryInterface для соответствующего интерфейса, и результат будет нулевым, если QueryInterface не работает (не совсем моя область знаний).

В одном из своих комментариев вы упомянули о захвате сэмплов. Если вы пытаетесь захватить кадры аудио или видео, вам нужно поместить захват семпла перед входными контактами фильтра мультиплексора avi.

Соединение потока медиатипа между мультиплексором AVI и устройством записи файлов на самом деле является просто способом отправки простых команд ввода-вывода через контактное соединение для записи/чтения потока байтов (работа мультиплексора AVI заключается в разработке форматирования). Эти вызовы или образцы IStream не всегда будут соответствовать отдельным кадрам аудио или видео.

Фильтр анализатора записи файла GraphStudioNext покажет вам отдельные примеры и вызовы IStream.

person persiflage    schedule 12.07.2018
comment
Я думаю, что пока знаю, как работать с методами QueryInterface. И ваш второй предпоследний абзац подтверждает мое предположение, что контактное соединение между avi muxer и file Writer не является соединением, как другие, и поставить фильтр между обоими фильтрами невозможно. - person Matthias; 16.07.2018