忽然想統計一下我錄製過的視訊一共多長時間,由於視訊檔案很多,一共72個,挨個開啟進行累加不是程式設計師應該想起的辦法。所以就打算寫一個程式來完成這件事,最核心的問題就是“獲得一個視訊檔案的時長”。 ffmpeg是一個專業的音訊視訊處理開源技術,藉助於它可以完成視訊轉碼、視訊截圖、視訊提取等工作,ffmepg也提供了獲取視訊長度的方法,不過想想只是獲取視訊長度這麼一件事就要動用ffmpeg有點“殺雞用牛刀”的感覺,所以就上網搜尋是否有其他獲得視訊檔案長度的方法,很快就找到了這樣一篇文章《C# 獲取視訊檔案播放時長》,使用下面的程式碼就可以獲得視訊檔案的長度:
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檔案,然後把每個檔案的時長累加即可:
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等才能在雲端計算時代遊刃有餘;
三年前只要掌握Lucene.Net就會說自己“熟悉站內搜尋引擎開發”;現在大家都用ElasticSearch了,你還用Lucene.Net就太老土了;
三年前發郵件還是用SmtpClient;現在做大型網站發郵件必須用雲郵件引擎;
三年前快取就是Context.Cache;現在則是Redis、Memcached的天下;
如鵬網再次引領.Net社群技術潮流!點選此處瞭解如鵬網.Net最新課程