Есть ли способ связать целый класс файлов с приложением на Windows? - PullRequest
1 голос
/ 19 марта 2020

У меня установлена ​​ванильная Windows 10 - нет никаких сторонних видеоплееров, есть только Windows Media Player и новое приложение Movies. Я подтвердил, что не могу воспроизвести, скажем, WebM (видео) файлов.

Однако у меня есть .webm ключ реестра под ключом HKEY_LOCAL_MACHINE\Software\Classes с ContentType значение "video/webm" и PerceivedType значение "video". Аналогичная ситуация наблюдается и с другими новыми расширениями, такими как .webp, .mkv и другими. Я не знаю, почему он существует и для чего были созданы эти ключи.

Это заставляет меня хотя бы полагать, что Windows должен быть способен классифицировать различные видео контейнеры в некоторый вид "видео" класса файлов, учитывая, как он, по крайней мере, теоретически знает, что это «видео /» основной тип MIME каждый, и тот факт, что они имеют один и тот же «воспринимаемый тип».

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

Дело в том, что мое приложение явно не поддерживает и не отклоняет отдельные форматы контейнеров видео, такие как WebM (.webm расширение) или MPEG-4 (.mp4 расширение) или любой другой - он передает файл для воспроизведения в DirectShow, который, в свою очередь, по своей конструкции использует установленные фильтры для попытки воспроизведения мультимедийных файлов. Поскольку эти фильтры могут быть установлены отдельно от моего приложения, я не вижу, как я могу надежно поддерживать связь по типу файла. Я бы предпочел делегировать это любой подсистеме Windows, создавшей ключ .webm под ключом HKEY_LOCAL_MACHINE\Software\Classes. Возможно, Microsoft обновляет их как часть Windows Обновления?

Если бы я мог связать все, что Windows рассматривает видеофайлы, однако это происходит с моим приложением для всего класса, который является видеофайлами, по крайней мере я может позволить пользователю попытаться воспроизвести все, что они выдают в мое приложение, благодаря тому, что оно доступно в контекстном меню, если Windows считает, что это медиафайл. Конечно, это не хуже, чем в старой ситуации, когда Windows Media Player обычно регистрируется в нескольких форматах контейнеров мультимедиа и все еще не может воспроизвести каждый файл каждого поддерживаемого формата из-за отсутствия кодеков. По крайней мере, мне не придется обновлять приложение каждый раз, когда выходит новый формат видео.

1 Ответ

1 голос
/ 21 марта 2020

Я не думаю, что это можно сделать так, как вы хотите, и для этого есть объективные причины.

Во-первых, процесс связывания оболочки начинается с расширения до сопоставления приложения, и это четко определенный процесс без классов файлов, созданных поверх набора расширений.

Во-вторых, не существует такой вещи, как "видео файлы" на первом месте. .mp4 и .webm не совсем видеофайлы, потому что, в частности, они могут содержать только аудиодорожки и, следовательно, быть аудиофайлами. Media API начинают чтение файлов с изучения деталей формата контейнера, идентификации дорожек и объявления о доступности дорожек / потоков для одноранговых API, таких как кодеки. То есть, «видеофайлы», во-первых, не очень строгое определение.

В-третьих, медиа-API, такие как DirectShow и Media Foundation, не используют сопоставление оболочки, когда речь идет о воспроизведении. Оболочка ассоциации и HKEY_CLASSES_ROOT используется только когда дело доходит до выбора приложения-обработчика. API-интерфейсы определяют свой собственный метод построения конвейера для данного файла, и они имеют свою собственную отдельную коллекцию обработчиков, определенных для расширения. Затем эти API-интерфейсы способны определять формат файлов с «неправильным» расширением, просматривая сами данные полезной нагрузки: если вы переименуете .wav в .avi, файл останется воспроизводимым, даже если форматы отличаются.

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

Возможно, вы также можете использовать обработчики свойств оболочки - PSLookupPropertyHandlerCLSID и друзей - для проверьте, является ли файл мультимедийным файлом. В видеофайле будет указано одно из свойств, связанных с видео, например PKEY_Video_FrameWidth.

Тогда, если вам просто нужно приблизительное предположение, является ли файл видеофайлом, вы можете проверить расширение по списку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMap.

Еще один быстрый способ проверить, может ли это быть видеофайл, - это проверить расширение по списку ассоциаций, заданному API c, например, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\ByteStreamHandlers. Это похоже на использование Media Foundation API, о котором я упоминал выше, но без его использования. В этом разделе реестра расширения ассоциируются с примитивами API c, а не с ассоциативными расширениями оболочки.

...