Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法将整个文件类与Windows上的应用程序相关联?_Windows_Video_Directshow_File Type Associations - Fatal编程技术网

有没有办法将整个文件类与Windows上的应用程序相关联?

有没有办法将整个文件类与Windows上的应用程序相关联?,windows,video,directshow,file-type-associations,Windows,Video,Directshow,File Type Associations,我安装了普通的Windows 10,没有任何第三方视频播放器,只有Windows Media Player和新的电影应用程序。我已经确认无法播放,比如,(视频)文件 但是,我确实在HKEY\U LOCAL\U MACHINE\Software\Classes项下有.webm注册表项,其中ContentType值为“video/webm”,而PerceivedType值为“video”。其他新的扩展也有类似的情况,比如.webp和.mkv等。我不知道它为什么在那里,是什么创造了这些钥匙 这至少让我

我安装了普通的Windows 10,没有任何第三方视频播放器,只有Windows Media Player和新的电影应用程序。我已经确认无法播放,比如,(视频)文件

但是,我确实在
HKEY\U LOCAL\U MACHINE\Software\Classes
项下有
.webm
注册表项,其中
ContentType
值为
“video/webm”
,而
PerceivedType
值为
“video”
。其他新的扩展也有类似的情况,比如
.webp
.mkv
等。我不知道它为什么在那里,是什么创造了这些钥匙

这至少让我相信Windows应该能够将不同的视频容器分类为某种“视频”类文件,因为它至少在理论上知道这些文件都是“视频/主要MIME类型”,并且它们共享相同的“感知类型”

那么,有没有一种方法可以将所有此类视频文件与我的应用程序关联起来,而不必为每个已知的视频格式显式创建一个关联?如果可能的话,我想从我认为Windows可能能够进行的分类中获益

问题是,我的应用程序并不明确支持或拒绝单独的视频容器格式,如WebM(
.WebM
扩展名)或MPEG-4(
.mp4
扩展名)或任何其他格式——它将要播放的文件传递给DirectShow,而DirectShow在设计上又依赖于安装的过滤器来尝试播放媒体文件。由于这些过滤器可以与我的应用程序分开安装,我不知道如何可靠地维护按文件类型关联。我宁愿将此任务委托给Windows子系统首先在
HKEY\U LOCAL\U MACHINE\Software\Classes
键下创建
.webm
键的任何子系统。也许Microsoft会将这些更新作为Windows Update的一部分进行更新


如果我可以将Windows认为是视频文件的任何内容与我的应用程序相关联(不管它是怎么做的),每个类都是视频文件,那么至少我可以允许用户尝试回放他们对我的应用程序抛出的任何内容,因为如果Windows认为它是媒体文件,它可以在上下文菜单中使用。当然,这并不比以前的情况更糟,Windows Media Player通常使用多种媒体容器格式进行注册,但由于缺少编解码器,仍然无法播放每种受支持格式的每个文件。至少我不必在每次新的视频格式出现时都更新我的应用程序。

我认为不可能按照您想要的方式进行,这是有客观原因的

首先,shell关联过程从扩展到应用程序的映射开始,这是一个定义良好的过程,没有在扩展集之上构建文件类

第二,根本不存在“视频文件”这类东西。mp4和.webm并不完全是视频文件,因为它们可以只保存音频曲目,因此可以是音频文件。媒体API开始读取文件,检查容器格式详细信息,识别曲目,并宣布对等API(如编解码器)的曲目/流可用性。也就是说,“视频文件”一开始并不是一个非常严格的定义

< P >第三,媒体API如DirectShow和MediaFoundation在重放时使用shell关联。Shell关联和
HKEY_CLASSES_ROOT
仅在选择处理程序应用程序时使用。API定义了自己的方法来为给定文件构建管道,并且它们有自己独立的扩展定义处理程序集合。然后,这些API能够通过查看有效负载数据本身来识别具有“错误”扩展名的文件格式:如果将.wav重命名为.avi,即使格式不同,该文件仍可以播放

也就是说,如果您想在应用程序中识别视频文件而不想过多考虑文件格式,为什么不使用上述媒体API之一并打开该文件呢。如果您可以通过API看到该文件公开了一个视频轨迹,那么它就是一个视频文件。尽管我不认为我掌握了为什么需要准确过滤视频文件的细节,但我可能会推荐这种方法

您可能还可以使用shell属性处理程序--
PSLookupPropertyHandlerCLSID
和friends来检查文件是否为媒体文件。视频文件将报告与视频相关的属性之一,如
PKEY\u Video\u FrameWidth

然后,如果您只需要大致猜测该文件是否为视频文件,您可以根据
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMap
列表检查扩展名


另一种快速检查是否可能是视频文件的方法是根据API特定的关联列表检查扩展名,如以下
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\ByTestStreamHandlers
。它类似于使用上面提到的媒体基础API,但实际上没有使用它。此注册表项是扩展与特定于API的原语相关联的地方,而不是与shell扩展关联的地方。

谢谢,罗曼,回答中有一些有用的细节!我知道如何委派播放,我想要的是类似“动态动词”的东西——给定媒体文件上下文菜单中的“播放”动词,如果容器格式实际上可以被解复用,或者可以选择解码部分/所有曲目,那么就在那里。相反,如果无法构建DirectShow/WMF图形,则无需在上下文菜单中使用“播放”动词。这样,我也不必维护支持的媒体容器格式列表,也不必在每次出现新的容器格式时更新我的应用程序或其安装程序