在 C# 中访问媒体文件的外壳属性“长度”(又名持续时间)

Posted

技术标签:

【中文标题】在 C# 中访问媒体文件的外壳属性“长度”(又名持续时间)【英文标题】:Access a media file's shell property "Length" (aka Duration) in C# 【发布时间】:2015-11-08 12:41:18 【问题描述】:

我注意到,在 Windows 7 中每个媒体文件的外壳属性中,视频文件的持续时间实际上称为“长度”。有人知道使用 shell 访问 length 属性的快速方法吗?

【问题讨论】:

【参考方案1】:

所以我找到了一种访问媒体文件的“长度”外壳属性或任何外壳属性的非常简单快捷的方法,只要您知道该属性的等效索引号。

首先你需要在你的项目中添加一个对 shell32 的引用,如下所示:

    右键项目

    点击添加参考

    在添加参考窗口中单击 .COM 选项卡

    选择 Microsoft Shell 控件和自动化

    点击确定

然后在您的代码隐藏中添加 using Shell32;。 现在,您可以在 foreach 循环中使用 GetDetailsOf() 方法提取文件夹中每个媒体文件的长度属性:

string[] supportedExtensions = new[]  ".mov", ".mp4", ".avi", ".mpeg", ".mpg", ".wmv", ".mkv", ".m4v", ".flv" ;

var allFiles = Directory.GetFiles(SelectedFolderPath, "*.*", SearchOption.TopDirectoryOnly).Where(s => supportedExtensions.Contains(System.IO.Path.GetExtension(s).ToLower()));

foreach (string name in allFiles)


   Shell shell = new Shell();
   Folder rFolder = shell.NameSpace(@SelectedFolderPath);
   FolderItem rFiles = rFolder.ParseName(System.IO.Path.GetFileName(name));
   string videosLength = rFolder.GetDetailsOf(rFiles, 27).Trim();

其中,“SelectedFolderPath”应该是您希望扫描的文件夹,而您在 GetDetailsOf 方法中作为参数看到的数字 27 是“Length”Shell 属性的索引号。

所以现在您在字符串“videosLength”中以##:##:## 格式获得了媒体文件的持续时间。

希望这会有所帮助! 干杯!

【讨论】:

【参考方案2】:

我已经为 Windows 10 21H1 build 19043.1165 和 VS 2012 尝试了上面的代码 .Net 4.5 上面不会直接编译下面的代码修改版本就可以了。

Shell32.Shell sh = new Shell32.Shell();
Shell32.Folder rFolder = sh.NameSpace(SelectedFolderPath);
Shell32.FolderItem rFiles = rFolder.ParseName(System.IO.Path.GetFileName(name));
string videosLength = rFolder.GetDetailsOf(rFiles,208).Trim();

以上代码读取了输入视频文件的媒体创建。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于在 C# 中访问媒体文件的外壳属性“长度”(又名持续时间)的主要内容,如果未能解决你的问题,请参考以下文章

访问 Matlab 类属性(又名常量)

在 C# 4 中使用动态类型访问 javascript 对象的属性

播放声音:访问长度和位置

使用 COM 互操作从非托管 C++ 访问 c# 属性

从 C# 上的函数处理程序访问表单控件

字符串长度超过maxJsonLength属性设置的值。c#