如何在C#中访问System.Video.FrameRate

4
Windows Shell的属性系统定义了一个名为System.Video.FrameRate(文档在这里)的标准属性,可用于大多数视频文件。周围的文档仅涵盖获取这些值的非托管API。
我如何在C#中访问此Windows属性?

此问题目前被暂停,原因是“不属于主题范围”。我已经进行了澄清,并且我认为现在应该很明确,这绝对是符合帮助中心中定义的“关于编程”的标准——它满足“具体的编程问题”和“实际可回答的问题,这些问题是编程专业所特有的”标准。如果提问者没有“展示……理解”,我相信编辑已经解决了这个问题。 - Ian Griffiths
感谢您编辑问题和回答。 - Matias
1个回答

4
要访问一个shell属性(这就是它的本质——这些“Windows”属性只是由Windows预定义的shell属性,与特定应用程序的属性不同),通常有两种方法:Interop或Windows API Code Pack。 Windows API Code Pack 是最简单的方法。要获取此属性,首先需要确定要使用哪个shell对象。(属性总是在某些特定对象上找到的。因此,此属性不是告诉您系统帧速率的全局值,而是通常出现在视频文件上,并告诉您该文件的帧速率。)以下代码获取我系统上的一个视频的shell对象,检索属性并显示其值。
ShellObject obj = ShellObject.FromParsingName(@"D:\Video\IanAndDeborahTree.mp4");
ShellProperty<uint?> rateProp = obj.Properties.GetProperty<uint?>("System.Video.FrameRate");
Debug.WriteLine("{0:G3}FPS", rateProp.Value/1000.0);

请注意,该属性的值是一个可空的无符号整数。如果你请求一个类型为int的属性,它会失败,表明没有这样的属性可用。因此,你必须选择uint?。你真的应该检查一下属性是否真的存在 - 我在这里不麻烦是因为我知道它肯定存在。
另一种方法是使用Interop直接与Shell API通信(这就是API代码包为您完成的工作)。不过这需要很多工作-你需要跳过大量的圈子才能实现这三行代码所做的事情,因为你最终需要定义一个出乎意料地多的COM接口形式以供.NET interop处理。

谢谢您的回答,Ian。我应该向项目中添加哪个参考?我应该使用哪些库呢?谢谢。 - Matias
您需要添加对两个DLL的引用:主要的代码包程序集 Microsoft.WindowsAPICodePack.dll 和 shell 程序集 Microsoft.WindowsAPICodePack.Shell.dll - Ian Griffiths
现在运行良好,谢谢。我必须使用Microsoft.WindowsAPICodePack,使用Microsoft.WindowsAPICodePack.Shell和using Microsoft.WindowsAPICodePack.Shell.PropertySystem。现在,您知道获取视频持续时间(以秒为单位)的属性是哪个吗?谢谢。 - Matias
再次问候,我在安装使用ShellObject.FromParsingName的应用程序时遇到了问题,这个解决方案在Windows XP上无法使用。您知道我应该怎么做才能在Windows XP上启用此功能吗?再次感谢。 - Matias
它可能实际上在XP上不可用。Vista中改变的一件事是,他们向shell的属性系统引入了大量新功能。我不确定,但如果XP无法提供此信息,这一点也不令人惊讶。如果在XP中在资源管理器中打开有关文件的属性会发生什么?是否有一种方法可以在资源管理器UI中查看所需的属性?如果没有,那么它几乎肯定也无法通过API获得。 - Ian Griffiths
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接