Я написал push-фильтр DirectShow для использования со Skype, используя Delphi Pro 6 и библиотеку DSPACK DirectShow. В режиме предварительного просмотра, когда вы тестируете устройство ввода видео в окне настроек видео клиента Skype, мой фильтр работает безупречно. Я могу оставить это в течение многих минут без ошибок.
Однако, когда я начинаю видеозвонок через 10–24 секунды, а не дольше, видеопоток останавливается. Вызов продолжается нормально, счетчик продолжительности звонка отбрасывает секунды, но видеопоток не работает, он застрял в любом кадре, в котором произошла остановка (хотя через некоторое время он становится черным, что, по моему мнению, означает, что Skype отказался от фильтра). Я попытался подключиться к процессу из моего отладчика, установив точку останова, буквально установленную при каждом вызове метода, и ни одна из них не была нажата после того, как произошла остановка. Это как если бы поток, который выполняет вызов DirectShow FillBuffer () к моему фильтру от имени Skype, был мертв или был остановлен.
Я не могу отследить свой фильтр в отладчике, потому что во время звонка Skype я получаю странные вызовы жесткого прерывания отладчика int 1 и int 3, когда идет видеозвонок Skype. Это происходит даже при выбранном стандартном устройстве ввода веб-камеры и моем фильтре DirectShow, полностью незарегистрированном как сервер ActiveX. Я подозреваю, что это может быть какой-то «анти-отладочный» код, поскольку он не происходит в режиме предварительного просмотра видеовхода. В любом случае, именно поэтому мне пришлось подключиться к процессу после факта, чтобы узнать, вызывается ли мой вызываемый метод FillBuffer (), и вместо этого обнаружил, что он кажется мертвым.
Обратите внимание, что фильтр DirectShow моей простой ванильной USB веб-камеры не демонстрирует замораживание и прекрасно работает в течение многих минут. В моем фильтре есть что-то, что Skype не нравится. Я пробовал операторы Sleep () с разными интервалами, никаких операторов Sleep, практически ничего не делая в вызове FillBuffer (). Ничего не помогает.
Если у кого-нибудь есть идеи о том, кто может быть виновником, я бы хотел знать.
Спасибо,
Роберт