Dot-Net
如何在 .NET 中檢索 MP3 的持續時間?
我已經建構了一個 WPF 應用程序,使用者可以在其中將 MP3 文件拖放到列錶框上。我需要一種方法來計算播放列表的總持續時間。
我應該使用任何庫嗎?或者是否可以僅使用 .NET 框架?
經過大量的理論研究,我找到了一種正確且無可爭議地計算 mp3 文件持續時間的方法。
讓我首先重申一下為什麼上面的標準方法不起作用:
ID3 方法:並非所有文件都有 id3 標籤,如果有,則可能沒有在其中設置持續時間欄位。
通過讀取一幀 * 文件大小進行估計:不適用於 VBR 文件。
Xing 標頭:並非所有文件都有它。
通過 PCM 大小解碼和確定它:我有 3+ GB 的文件,我不會等到它解碼。
我到處閱讀,所有事情都導致了 NAudio。馬克,感謝您的努力和乾淨的來源!然而,NAudio 最常用的一種方法是使用 Mp3FileReader 讀取文件並獲取所有幀。問題:Mp3FileReader 在開始時創建一個 TOC,這需要很長時間,即使對於只有一天的小文件也是如此 :)
Mark 建議我刪除 TOC 創建,因為源可用,並且在執行此操作時,我發現了更簡單的方法。這裡是; 不言自明:
double GetMediaDuration(string MediaFilename) { double duration = 0.0; using (FileStream fs = File.OpenRead(MediaFilename)) { Mp3Frame frame = Mp3Frame.LoadFromStream(fs); if (frame != null) { _sampleFrequency = (uint)frame.SampleRate; } while (frame != null) { if (frame.ChannelMode == ChannelMode.Mono) { duration += (double)frame.SampleCount * 2.0 / (double)frame.SampleRate; } else { duration += (double)frame.SampleCount * 4.0 / (double)frame.SampleRate; } frame = Mp3Frame.LoadFromStream(fs); } } return duration; }