#delphi #directx #directshow #skype #dspack
#delphi #directx #directshow #skype #dspack
Вопрос:
Я использую Delphi 6 с DSPACK для выполнения нескольких операций, связанных со звуком и DirectX. У меня есть «входная» сторона, в которой я определил, где я назначаю одно из перечисленных устройств ввода звука объекту TFilter и подключаю этот фильтр к объекту TSampleGrabber, и это дает мне аудиобуферы, необходимые для отправки аудио в Skype. Мне нужно выяснить логическую обратную сторону этого графика. Я получаю аудиобуферы из Skype через сокет. Мне нужно создать график с фильтром, который был бы дополнением к TSampleGrabber. Другими словами, TFilter, который вместо доставки аудиобуферов во время события, которое срабатывает при появлении нового звука, как это делает TSampleGrabber, будет иметь аналогичное событие, которое срабатывает, когда для подачи нового звука необходимо подать график. В конце этого «выходного» графика будет находиться TFilter, назначенный одному из перечисленных устройств вывода звука, входные контакты которого будут подключаться к выходным выводам этого обратного двойника TSampleGrabber.
Кто-нибудь знает, как это сделать? Я, конечно, предпочел бы избежать написания собственного COM-объекта пользовательского фильтра, чтобы сделать это. Я надеюсь, что существует существующий TFilter, который принимает пользовательские аудиобуферы для смешивания с графиком фильтров DirectX.
Ответ №1:
Общей отправной точкой для фильтра ввода данных является образец фильтров Push Source. Это создает фильтр с выводом только вывода, который вводит данные в конвейер DirectShow, данные могут быть любого типа, и обычно это видео или аудио.
Как вы упомянули Delphi и DSPack, у последнего этот образец портирован (см. Demos D6-D7 Filters PushSource ).
Комментарии:
1. Спасибо @Roman R. Есть ли у вас какие-либо советы или предостережения по подключению фильтра к нескольким выходным фильтрам? То есть выполнение нескольких вызовов connect с нескольких выходных контактов одного фильтра на одни и те же входные контакты фильтра, особенно когда речь идет о настройке типов форматов мультимедиа?
2. Это не совсем так. Для каждого графика фильтров будет отдельный экземпляр фильтра, а сам DirectShow не предоставляет средств для соединения экземпляров вместе. Вы можете сделать это самостоятельно. Любой экземпляр фильтра может участвовать только в одном графике, вывод имеет только один вывод для однорангового соединения. Итак, если вы планируете фильтр, который принимает несколько подключений в нескольких приложениях, часть, которая управляет внутренними подключениями, полностью зависит от вас.
3. Возможно, я плохо выразил свой вопрос @Roman R. Я не говорю о смешивании графиков, вместо этого я хочу подключить выходные выводы двух фильтров на одном графике к входным выводам другого фильтра на том же графике (многие к одному соединению). Например, подключение выходных выводов двух фильтров push-источников к тем же входным выводам другого фильтра, тем самым смешивая звук из двух фильтров push-источников вместе. Возможно ли это, и если да, какие-либо советы или предостережения по этому поводу, особенно когда речь идет о типах форматов аудионосителей?
4. Это возможно и в принципе нормально — все мультиплексирующие фильтры работают таким образом. Однако вам нужно позаботиться об одной вещи: вы должны тщательно отмечать исходящие сэмплы, чтобы сэмплы из 2 источников совпадали по времени.
5. Аудиоданные имеют временные метки, и они очень важны. Я могу сразу подумать о нескольких вещах, в которых важна временная метка звука: (a) синхронизация губ с воспроизведением видео аудио, как еще вы можете вычислить конкретный аудиофрагмент, который будет транслироваться точно с определенным таймфреймом? (б) убедиться, что аудиоданные непрерывны без каких-либо пробелов? без временных меток нижестоящий узел должен был бы предполагать, что данные непрерывны, хотя это может быть и не так (c) соответствие скорости для живого источника должно знать временные метки исходного источника.