Dot-Net

如何在 .NET 中檢索 MP3 的持續時間?

  • November 7, 2012

我已經建構了一個 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;
   }

引用自:https://stackoverflow.com/questions/383164