统计《ASP.Net特供视频教程》总长度 - 杨中科
这套视频教程是专门为自学的同学录制的,自学的同学时间都不像在传智播客脱产学习的同学那样有大块的时间,碎片的时间比较多,所以这次的视频一般都是10-20分钟一段的“短视频”,一段视频讲一个知识点。看着网上同学们对这套视频的赞美我心里很高兴,忽然想统计一下这套视频一共多长时间,由于视频文件很多,一共72个,挨个打开进行累加不是程序员应该想起的办法。所以就打算写一个程序来完成这件事,最核心的问题就是“获得一个视频文件的时长”。 ffmpeg是一个专业的音频视频处理开源技术,借助于它可以完成视频转码、视频截图、视频提取等工作,ffmepg也提供了获取视频长度的方法,不过想想只是获取视频长度这么一件事就要动用ffmpeg有点“杀鸡用牛刀”的感觉,所以就上网搜寻是否有其他获得视频文件长度的方法,很快就找到了这样一篇文章《C# 获取视频文件播放时长》,使用下面的代码就可以获得视频文件的长度:
1 public string GetMediaTimeLen(string path) 2 3 { 4 5 try 6 7 { 8 9 Shell32.Shell shell = new Shell32.ShellClass(); 10 11 Shell32.Folder folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\\"))); 12 13 Shell32.FolderItem folderitem = 14 15 folder.ParseName(path.Substring(path.LastIndexOf("\\") + 1)); 16 17 if (Environment.OSVersion.Version.Major >= 6) 18 19 { 20 21 return folder.GetDetailsOf(folderitem, 27); 22 23 } 24 25 else 26 27 { 28 29 return folder.GetDetailsOf(folderitem, 21); 30 31 } 32 33 34 35 } 36 37 catch (Exception ex) 38 39 { 40 41 return null; 42 43 } 44 45 }
把这段代码放到VS中编译,发现找不到Shell32.Shell等类,原来还需要手动引入Shell32这个Com组件,太麻烦。我想到借助于C#中的dynamic新特性可以简化Com组件调用,就把代码改写成如下:
1 public static string GetMediaTimeLen(string path) 2 3 { 4 5 System.Type objType = System.Type.GetTypeFromProgID("Shell.Application"); 6 7 dynamic shell = System.Activator.CreateInstance(objType); 8 9 //文件路径 10 11 dynamic folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\\"))); 12 13 //文件名称 14 15 dynamic folderitem = folder.ParseName(path.Substring(path.LastIndexOf("\\") + 1)); 16 17 if (Environment.OSVersion.Version.Major >= 6) 18 19 { 20 21 return folder.GetDetailsOf(folderitem, 27); 22 23 } 24 25 else 26 27 { 28 29 return folder.GetDetailsOf(folderitem, 21); 30 31 } 32 33 }
接下来的程序就很简单了,遍历文件夹下所有的.wmv文件,然后把每个文件的时长累加即可:
1 string[] files = System.IO.Directory.GetFiles(@"F:\视频教程\2013年底asp.net公开课\剪辑后", "*.wmv", System.IO.SearchOption.AllDirectories); 2 3 TimeSpan tsTotal = TimeSpan.Zero; 4 5 foreach (string file in files) 6 7 { 8 9 string len = GetMediaTimeLen(file); 10 11 TimeSpan tsLen = TimeSpan.Parse(len); 12 13 tsTotal += tsLen; 14 15 } 16 17 18 19 Console.WriteLine(tsTotal);
程序运行了一会就得到了结果
本文出自 杨中科

浙公网安备 33010602011771号