突然想統計一下我錄製過的視頻一共多長時間,因爲視頻文件不少,一共72個,挨個打開進行累加不是程序員應該想起的辦法。因此就打算寫一個程序來完成這件事,最核心的問題就是「得到一個視頻文件的時長」。 ffmpeg是一個專業的音頻視頻處理開源技術,藉助於它能夠完成視頻轉碼、視頻截圖、視頻提取等工做,ffmepg也提供了獲取視頻長度的方法,不過想一想只是獲取視頻長度這麼一件事就要動用ffmpeg有點「殺雞用牛刀」的感受,因此就上網搜尋是否有其餘得到視頻文件長度的方法,很快就找到了這樣一篇文章《C# 獲取視頻文件播放時長》,使用下面的代碼就能夠得到視頻文件的長度:html
public string GetMediaTimeLen(string path) { try { Shell32.Shell shell = new Shell32.ShellClass(); Shell32.Folder folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\\"))); Shell32.FolderItem folderitem = folder.ParseName(path.Substring(path.LastIndexOf("\\") + 1)); if (Environment.OSVersion.Version.Major >= 6) { return folder.GetDetailsOf(folderitem, 27); } else { return folder.GetDetailsOf(folderitem, 21); } } catch (Exception ex) { return null; } }
把這段代碼放到VS中編譯,發現找不到Shell32.Shell等類,原來還須要手動引入Shell32這個Com組件,太麻煩。我想到藉助於C#中的dynamic新特性能夠簡化Com組件調用,就把代碼改寫成以下:程序員
public static string GetMediaTimeLen(string path) { System.Type objType = System.Type.GetTypeFromProgID("Shell.Application"); dynamic shell = System.Activator.CreateInstance(objType); //文件路徑 dynamic folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\\"))); //文件名稱 dynamic folderitem = folder.ParseName(path.Substring(path.LastIndexOf("\\") + 1)); if (Environment.OSVersion.Version.Major >= 6) { return folder.GetDetailsOf(folderitem, 27); } else { return folder.GetDetailsOf(folderitem, 21); } }
接下來的程序就很簡單了,遍歷文件夾下全部的.wmv文件,而後把每一個文件的時長累加便可:shell
string[] files = System.IO.Directory.GetFiles(@"F:\視頻教程\2013年末asp.net公開課\剪輯後", "*.wmv", System.IO.SearchOption.AllDirectories); TimeSpan tsTotal = TimeSpan.Zero; foreach (string file in files) { string len = GetMediaTimeLen(file); TimeSpan tsLen = TimeSpan.Parse(len); tsTotal += tsLen; } Console.WriteLine(tsTotal);
程序運行了一會就獲得告終果「16:27:35」!數據庫
從ASP.Net零基礎到學生熟悉ASP.Net的本質、會使用ASP.Net實現增刪改查程序、掌握Cookie/Session的原理、掌握AJAX到最後使用ASP.Net開發一個企業網站系統,只用16個小時,這種自豪感瞬間爆棚!緩存
如鵬網.Net培訓班正在報名,有網絡的地方就能夠參加如鵬網的學習,學完就能高薪就業,點擊此處瞭解安全
三年前只要懂「三層架構」就能夠說「精通分層架構」;如今則須要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;網絡
三年前只要會SQLServer就能夠說本身「精通數據庫開發」;如今則需還須要掌握MySQL等開源數據庫才能說是「.Net開源」時代的程序員;架構
三年前只要會進行用戶上傳內容的安全性處理便可;如今則須要熟悉雲存儲、CDN等才能在雲計算時代遊刃有餘;asp.net
三年前只要掌握Lucene.Net就會說本身「熟悉站內搜索引擎開發」;如今你們都用ElasticSearch了,你還用Lucene.Net就太老土了;學習
三年前發郵件仍是用SmtpClient;如今作大型網站發郵件必須用雲郵件引擎;
三年前緩存就是Context.Cache;如今則是Redis、Memcached的天下;
如鵬網再次引領.Net社區技術潮流!點擊此處瞭解如鵬網.Net最新課程